【问题标题】:Returning partial state返回部分状态
【发布时间】:2016-05-23 16:24:40
【问题描述】:

我有一个大型 json 数据集,用于存储产品,我称之为 products source of truth。使用一些过滤,我必须过滤这个 dataset 并返回一个 subset 与过滤器匹配的产品。我可以使用不同的过滤器,它应该从事实来源返回一个子集。过滤器可以是 (1) 标题中包含关键字“javascript”的产品 (2) 价格大于 10 美元的产品。我还可以为这个事实来源添加一个新产品。我可以再次应用过滤器,新添加的产品可能会返回结果子集中。

我看到的所有 reducer 示例都从前一个状态返回一个状态。因此,就我而言,如果我遵循该 reducer 原则,我可以对 products source of truth 应用过滤器并获得一个新状态。现在,如果我应用另一个过滤器,我只能将它应用到新状态而不是事实来源。因此,过滤器是在已过滤的产品状态上完成的。

我希望过滤器应用于原始/主产品的真实来源。我不希望将过滤器应用于已过滤的状态。

有人可以帮忙吗?

【问题讨论】:

    标签: redux react-redux


    【解决方案1】:

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

    也许可以创建一个名为 FILTER_RESULTS 的“类型”。然后你在你的动作创建者文件中创建一个动作:

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

    然后你的 reducer 会有一个 switch 语句,它将 action.payload 返回到过滤数据的状态。

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

    【讨论】:

    • 在哪里可以进行过滤?在 reducer 或 MapStateToProps 函数中?
    • 我修改了我的答案以进行澄清,但请参阅我添加的链接。它将向您展示 action creators、reducers 和 connect 如何协同工作的基本示例。
    • 您的解决方案建议有两种不同的状态 - 主状态和子状态。 Abhinav 的解决方案是只使用一种状态,并且不使用 redux 存储新状态。这是一个 UI 问题,因此请在 UI 中进行管理。
    【解决方案2】:

    如果要在component 本身的客户端上完成过滤数据的逻辑,您应该实现它,因为它是"transient state"

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

    1. Filter 组件 - 渲染过滤器部分,我们在其中选择此类过滤器。
    2. WorkspaceView 组件 - 用数据渲染实际视图,我们在其中看到数据。

    那么你的Container组件会根据Filter组件发送的filters过滤数据本身,并将数据传递给WorkspaceView

    我认为Redux 不应该用于这种“临时”状态,而应该只用于从后端提供数据的情况。

    【讨论】:

      猜你喜欢
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2014-06-09
      • 2020-11-14
      • 1970-01-01
      相关资源
      最近更新 更多