在 Action Creator 中从 Redux Store 获取状态的最佳方式

Best Way to Get State from Redux Store in Action Creator

我的店铺是这样的:

{
    nodes: {
        node1: { childIds: [], },
        node2: { childIds: [], },
    },
    selectedNode: 'node1',
}

我有一个 ADD_CHILD 动作是这样的:

export function addChild(parentId, childId) {
  return {
    type: ADD_CHILD,
    parentId,
    childId,
  };
}

reducer 将childId 添加到parentId 对象的childId 下。因此,addChild('node1', 'node2') 导致此状态:

{
    nodes: {
        node1: { childIds: ['node2'], },
        node2: { childIds: [], },
    },
    selectedNode: 'node1',
}

到目前为止一切顺利。

我想做的是让 parentId 参数在我的动作创建器中是可选的。如果未指定给操作创建者,我希望我的逻辑自动将 parentId 默认为商店中的 selectedNode 值。

默认使用商店值的最佳实践方法是什么?我能想到的选项:

  1. 使用 Redux-thunk 或类似工具访问我的动作创建器中的状态,并在那里拉取 selectedNode 值。我倾向于这种方法...除了在我的动作创建者中扩展逻辑量之外,我没有看到很多缺点。

  2. 扩展我的节点缩减器以覆盖更多的状态区域,包括将 selectedNode 放入它接收的状态。我不喜欢这样,因为它增加了减速器的复杂性并将接口状态放入我的节点数据中。

  3. 使用 mapStateToProps 将 selectedNode 值作为道具告诉我的组件,因此当它调用动作创建器时它可以传递它。我不喜欢这样,因为它会导致我的组件在 selectedNode 更改时重新呈现(否则该组件不需要这样做)。

还有其他选择吗?我主要对最佳实践感兴趣,因为我认为这些方法都行得通。

我建议你看看reduce-reducers

Redux 提供的众所周知的 combineReducers() 并行运行 reducer,如果你愿意的话,每个 reducer 只知道自己范围内的状态片段。 reducer 的其他配置也是可能的。 例如,您可以 reduce 一个 reducer 数组 ,运行 每个 系列,这意味着每个人都会从其前身获得一个新计算的状态对象,用于计算它将传递的新状态。

在您的情况下,这将使您的减速器在减少您的 ADD_CHILD 操作的同时了解 selectedNode。如果 action 中没有设置 parentId,reducer 可以默认为 selectedNode。您只需确保更改 selectedNode 的减速器在处理 ADD_CHILD.

的减速器上运行 upstream

这在 Redux 文档 Redux docs: sharing-data-between-slice-reducers.

中以很好的方式(通过示例)进行了介绍

使用此模式可以避免 thunk,维护简单的 action creators,仍然有简单的组件选择器,将状态逻辑保留在它所属的 reducers 中,并仍然保持你的 reducers 纯净。在尝试了您自己提到的大多数其他模式后,我推荐这种方法。

祝你好运!