给出一个像这个问题中的用例:
Best way to update related state fields with split reducers?
处理依赖于自身州以外的州的减速器行动的最佳做法是什么?上面问题的作者最终只是将整个状态树作为第三个参数传递给每个reducer。这看起来很凶悍,风险很大。 Redux FAQ列出了以下可能的解决方案:
- 如果reducer需要知道来自另一个状态片的数据,则可能需要重新组织状态树形状,以便单个reducer处理更多数据。
- 您可能需要编写一些自定义函数来处理其中一些操作。这可能需要将combineReducers替换为您自己的顶级reducer功能。
- 您还可以使用reduce-reducers等实用程序来运行combineReducers来处理大多数操作,还可以为跨越状态切片的特定操作运行更专业的reducer。
- 异步动作创建者(如redux-thunk)可以通过getState()访问整个状态。操作创建者可以从状态中检索其他数据并将其放入操作中,以便每个reducer都有足够的信息来更新自己的状态切片。
在我的用例中,我有一个“继续”操作,用于确定允许用户在多表单/多步骤过程中访问哪个页面,因为这几乎取决于整个应用程序状态,在我的任何儿童减速器中都无法处理。现在,我已将商店拉入行动创作者。我使用商店的当前状态来计算一个操作对象,该对象触发我的“page”reducer,它会更改活动页面。我可能会在这个动作创建者中安装redux-thunk并使用getState(),但我还没有采用这种方法。
我想这对解决方案来说并不算太糟糕,因为只有一个动作(到目前为止)必须以这种方式处理。我只是想知道是否有更好的解决方案,或者是否有办法重新构建我的状态和reducers以使其更容易,或者我正在做的是Redux的最佳实践。如果有任何类似的例子,那也会有所帮助。
为了提供更多上下文,我的状态树目前看起来像这样:
{
order: order.result,
items: order.entities.items,
activePage: {
id: 'fulfillment'
// page info
},
pagesById: { // all the possible pages
fulfillment: {
id: 'fulfillment'
// page info
}
}
}
活动页面是用户必须输入数据才能进入下一页的页面/部分。确定活动页面几乎总是取决于项目状态,有时取决于订单状态。最终结果是一个应用程序,用户连续填写几个表单,一旦表单有效就会继续。在继续时,应用程序确定所需的下一页并显示它,依此类推。
编辑:我们尝试过将“全球”减速器与儿童减速器结合使用的方法。
实施就是这样......
const global = (currentState = initialState, action) => {
switch (action.type) {
default:
return currentState
}
}
const subReducers = combineReducers({
order,
meta
})
export default function (currentState = initialState, action) {
var nextState = global(currentState, action)
return subReducers(nextState, action)
}
全局reducer首先在整个app状态下运行,然后将其结果输入到child reducer。我喜欢这样一个事实,即我不再在动作创作者中放入一堆逻辑来阅读不同的州。
我认为这与redux的原理一致,因为每个动作仍然会击中每个减速器,并且减速器的调用顺序始终相同。对此实施的任何想法?
编辑:我们现在使用路由器库来处理页面状态,因此activePage和pagesById消失了。
答案 0 :(得分:0)
如果state.activePage依赖于state.order和state.items,您可以订阅商店,如果对" order"进行修改。或"项目"然后发送一个" checkPage"如有必要,可以设置另一个活动页面的操作。一种方法应该连接到顶部组件"订单和商品,听取他们的价值观并更改活动页面/重定向
不容易理解您的担忧,我希望我的信息会有所帮助。祝你好运