2016-05-23 46 views
0

我有一个大的json数据集产品,我称之为产品真相源。使用一些过滤,我必须过滤这个数据集并返回与过滤器匹配的产品的子集。我可以使用不同的过滤器,它应该从真相源返回一个子集。过滤器可以是(1)在标题(2)产品中具有关键字'javascript'的产品,其价格大于10美元。我也可以添加一个新的产品来解释这个事实。我可以再次应用筛选器,新添加的产品可能会返回结果子集。返回部分状态

我看到的所有reducer示例都从前一个状态返回一个状态。所以,就我而言,如果遵循减速原理,我可以在产品真假源上应用一个过滤器,并获得新的状态。现在,如果我应用另一个过滤器,我只能将其应用于新状态,而不能应用于真相源。所以,过滤器是在已经过滤的产品状态下完成的。

我想过滤器适用于原始/主产品的真相源。我不希望过滤器应用于已经过滤的状态。

有人可以帮忙吗?

回答

1

您可以制作一段叫做fullData的状态来保存整个大型的JSON数据集,然后您的过滤器可以调用一个将fullData的子集调度为filteredData(一个单独的状态)的动作吗?如果filteredData不存在,则可以创建一个呈现fullData的函数,否则将呈现filteredData。这可能不是最优雅的解决方案,但我认为它会起作用。

制作一个叫做FILTER_RESULTS的'type',也许吧。然后,你在你的行动的创建者文件中创建一个动作:

export function filterResults(fullData) { 
// javascript here to filter results 
return { 
    type: FILTER_RESULTS, 
    payload: <variable containing filtered results> 
}; 
} 

那么你的减速将有一个switch语句,将action.payload回到filteredData件状态。

您的操作执行过滤,将过滤的结果传递给reducer,并且您的mapStateToProps允许组件访问您的状态。看看这里:https://github.com/joshuaslate/mern-starter

+0

哪里可以完成过滤?在redurs或** MapStateToProps **函数中? –

+0

我修改了我的答案以供澄清,但请参阅我添加的链接。它会向您展示动作创作者,减速器和连接工作的基本示例。 –

+0

您的解决方案建议有两种不同的状态 - 主状态和子状态。 Abhinav的解决方案是只使用一个状态,并且不会为新状态使用redux存储。这是一个用户界面的问题,所以在UI中进行管理。 –

1

如果要在component本身的客户端sidem上执行数据过滤逻辑,因为它是"transient state"

说,如果你有一个Container组件,它具有数据,并呈现以下组件:

  1. Filter组件 - 渲染过滤器部分,在这里我们选择这样的过滤器。
  2. WorkspaceView组件 - 渲染实际视图与数据,我们在哪里看到数据。

然后你Container组件将筛选基于由Filter组件发送的filters数据本身和对数据传递给WorkspaceView

我不认为Redux应该在以下情况下可使用这样的“临时”状态,并且应该仅在从后端或其他事物提供数据的情况下使用。