在 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
值。
默认使用商店值的最佳实践方法是什么?我能想到的选项:
使用 Redux-thunk 或类似工具访问我的动作创建器中的状态,并在那里拉取 selectedNode 值。我倾向于这种方法...除了在我的动作创建者中扩展逻辑量之外,我没有看到很多缺点。
扩展我的节点缩减器以覆盖更多的状态区域,包括将 selectedNode 放入它接收的状态。我不喜欢这样,因为它增加了减速器的复杂性并将接口状态放入我的节点数据中。
使用 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 纯净。在尝试了您自己提到的大多数其他模式后,我推荐这种方法。
祝你好运!
我的店铺是这样的:
{
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
值。
默认使用商店值的最佳实践方法是什么?我能想到的选项:
使用 Redux-thunk 或类似工具访问我的动作创建器中的状态,并在那里拉取 selectedNode 值。我倾向于这种方法...除了在我的动作创建者中扩展逻辑量之外,我没有看到很多缺点。
扩展我的节点缩减器以覆盖更多的状态区域,包括将 selectedNode 放入它接收的状态。我不喜欢这样,因为它增加了减速器的复杂性并将接口状态放入我的节点数据中。
使用 mapStateToProps 将 selectedNode 值作为道具告诉我的组件,因此当它调用动作创建器时它可以传递它。我不喜欢这样,因为它会导致我的组件在 selectedNode 更改时重新呈现(否则该组件不需要这样做)。
还有其他选择吗?我主要对最佳实践感兴趣,因为我认为这些方法都行得通。
我建议你看看reduce-reducers
。
Redux 提供的众所周知的 combineReducers()
并行运行 reducer,如果你愿意的话,每个 reducer 只知道自己范围内的状态片段。 reducer 的其他配置也是可能的。 例如,您可以 reduce 一个 reducer 数组 ,运行 每个 系列,这意味着每个人都会从其前身获得一个新计算的状态对象,用于计算它将传递的新状态。
在您的情况下,这将使您的减速器在减少您的 ADD_CHILD
操作的同时了解 selectedNode
。如果 action 中没有设置 parentId
,reducer 可以默认为 selectedNode
。您只需确保更改 selectedNode
的减速器在处理 ADD_CHILD
.
这在 Redux 文档 Redux docs: sharing-data-between-slice-reducers.
中以很好的方式(通过示例)进行了介绍使用此模式可以避免 thunk,维护简单的 action creators,仍然有简单的组件选择器,将状态逻辑保留在它所属的 reducers 中,并仍然保持你的 reducers 纯净。在尝试了您自己提到的大多数其他模式后,我推荐这种方法。
祝你好运!