我想通过周围Redux的一些场景,我没能找到一个干净的解决方案,以这个例子:Redux的派遣行动
比方说,你有一个组件,它是食谱的列表。当您从该列表中选择一个配方时,您需要dispatch(RECIPE_SELECTED)
。异步动作创建者可能会做与配方有关的其他附加信息 - 可能是异步获取配方的配料,将选择保存到服务器,无论如何。
在一个完全独立的组件中,你有一个专业厨师名单。理想的行为是,当用户选择食谱时,与任何具有所选食谱变体的厨师一起填写专业厨师名单。
你怎么听RECIPE_SELECTED
,然后调度一个完全不相关的行为,依赖于配方?喜欢的东西...
when RECIPE_SELECTED:recipe
loadChefs(recipe).then(res => dispatch(CHEFS_LOADED, res.chefs))
您可以混合此loadChefs/dispatch
成RECIPE_SELECTED
行动创造者,但是这是一个关注十分难看的混合和将迅速编织错综复杂的。
你也可以做一些非常必要的(即对粮食的终极版)的东西,像这样(使用反应):
componentWillReceiveProps(nextProps) {
if (nextProps.recipe !== this.props.recipe) {
const { dispatch, recipe } = nextProps
dispatch(loadChefs(recipe))
}
}
我真的不喜欢这两种解决方案。思考?
我认为你太快剔除了我的问题:“你可以将这个loadChefs/dispatch混合到RECIPE_SELECTED的动作创建者中,但是这实际上是一个严重混淆的问题,并且会很快编织一个纠结的网络。其中一个主要目标是避免模块之间的混合问题。为什么'selectRecipe'创建者必须知道它也应该执行'loadChefs'?它不应该。这是将完全独立的域混合到同一个动作创建者中......这意味着更远的路上你将有一个动作创建者在一个模块中,该模块持有关于数十个其他模块的领域知识。 – Clev3r
我不同意。如果选择一个新配方导致加载厨师名单,那么他们不是单独的关注。在redux中没有这样的动作监听器。任何复杂的逻辑(特别是异步的东西)都属于您的行为创建者。你可以做的是将他们分成简单和复杂的动作创作者,如上所示。 –