【问题标题】:Redux - dependant application stateRedux - 依赖应用程序状态
【发布时间】:2018-05-13 05:40:58
【问题描述】:

我目前正在尝试围绕 redux 进行思考,但我目前在理解如何处理 redux 中的依赖状态方面存在问题。

以电子表格应用为例:

在单元格 A1 和 A2 中,用户正在输入值。

单元格 A3 现在具有以下依赖状态 (=Sum(A1;A2))

所以现在,当用户在 A1 中输入“2” => 我们发送一个“UpdateCellAction: A1=2” 然后,他在 A2 中输入“4” => 我们发送一个“UpdateCellAction: A2=4”

但由于这些变化,我在 A3 中的公式必须做出反应,并通过查看 2 和 4 的和,即 6 来修改状态对象

这样的事情在 Redux 中是如何完成的? 而且,如果有另一个单元格 B22(无论如何)根据 A3、A2 和 A1 计算另一个值怎么办? (该状态将取决于 A1、A2 和 A3)

【问题讨论】:

    标签: redux


    【解决方案1】:

    这是一个常见的用例。您正在寻找的是 react/reselect 库:

    来自重新选择github项目页面:

    选择器可以计算派生数据,允许 Redux 存储尽可能少的状态。

    选择器是有效的。除非其中一个参数发生变化,否则不会重新计算选择器。

    选择器是可组合的。它们可以用作其他选择器的输入。

    【讨论】:

    • 虽然@ghassenlouhaichi 在这里可能有一点,但这实际上为我指出了一个可能的解决方案。
    【解决方案2】:

    如果您认为每个单元格都是一个单独的组件,您的问题并不清楚。


    如果每个单元格都是一个单独的组件:

    您将使用 Redux 在每次编辑每个单元格时调度一个操作,并将该值保存在 Redux 存储中的唯一键下。您还可以使用 mapStateToProps 来获取要在本地计算的其他组件的所有值。

    ...
    
    /**
    * Redux mappings
    */
    const mapStateToProps = (state) => {
     return {
       cellA1: state.cells.cellA1,
       cellA2: state.cells.cellA2,
     };
    };
    
    const mapDispatchToProps = (dispatch) => {
     return {
       updateCell: (newCellValue) => {
         dispatch(Actions.updateCell(newCellValue));
       },
     };
    };
    
    const ConnectedCellComponent = connect(
     mapStateToProps,
     mapDispatchToProps,
    )(CellComponent);
    

    如果整个电子表格是一个组件:

    您将所有单元格数据存储在本地状态对象中,然后每当单元格更新时,您将调用 setState() 和 render() 将被自动调用,并且所有单元格将适当地重新计算。

    【讨论】:

    • 感谢您的回复。但是,对于“mapStateToProps”的建议使用,我必须知道我依赖哪些单元格(通过解析公式)。此外,每当单元格 A1 发生更改时,另一个单元格 A3 所依赖的单元格将调度第二个操作以更新 A3 的值。这实际上导致了两个不同的顺序状态变化,这不是我们所需要的。更新所有依赖单元格对 A1 的更改应该只是一个原子操作。否则撤消重做是不可行的,对吧?
    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多