处理 Redux Store 数据中的依赖关系

Handling dependencies in Redux Store data

我和我的团队正忙着设计一个 redux store,包括所有可能被激发的动作。由于我们应用程序的性质,我们在 redux 存储的不同节点(分支?)之间有一些固有的 coupling/dependencies。我们以最具可扩展性的方式处理这些依赖关系的想法是将其提取到状态树中它自己的单独节点。让我举一个简化的例子来说明我们心中的结构,并解决我们面临的问题:

假设我们的状态树有以下内容:

你可能在想,为什么要这样做?为什么不直接将依赖项集成到 SectionB 的 reducer 中?原因是这些依赖关系因客户端而异,我们正在从数据库中读取它们。它可以 link 状态树的任何部分到任何其他部分,并有自己需要发生的动作。

现在,我的问题是,我们如何在考虑这些依赖性的同时减少操作?如果我们的申请流程是:

  1. 用户原因 TOGGLE_DATA_A 操作
  2. SectionA减速器更新数据A
  3. DependencySection 根据依赖更新数据B

如果我们引入 SectionC,其中数据 C 依赖于数据 B,会发生什么情况?当 DependencySection 更新数据 B 时,似乎需要触发一个新操作,该操作是数据 B 已更新。这将意味着在减少另一个动作的同时触发一个动作,这显然是不允许的。或者,让不同的 reducer 部分以非常特定的顺序执行似乎也可以解决问题,但这肯定是一种反模式。

我们能想出的唯一解决方案是让中间件在每次操作后重复触发 UPDATE 操作,直到状态不再改变。例如,在 TOGGLE_DATA_A 操作更新数据 B 之后(通过对数据 A 的依赖),下一个 UPDATE 操作将更新数据 C(通过对数据 B 的依赖),下一个 UPDATE 将不更新任何内容,停止环形。这很hacky。

那么,有没有更好的方法来处理减少这样的依赖状态呢?或者我们应该以不同的方式构建我们的状态树?

Redux 背后的一个关键概念是 reducer 逻辑只是函数,如果您需要按特定顺序对状态更新处理进行排序,您可以自己完成通过为此编写明确的代码。所以不,"making different reducer sections execute in a specific order" 不是 而不是 和 "anti-pattern",这绝对是 Redux 的一种有效且值得鼓励的方法。

Structuring Reducers - Beyond combineReducers section of the Redux docs, and in my blog posts Idiomatic Redux: The Tao of Redux, Part 1 - Implementation and Intent and Practical Redux, Part 7: Feature Reducers 中有关于此方法的示例和讨论。我将粘贴一个基本的假设示例:

export function commentsReducer(state = initialState, action, hasPostReallyBeenAdded) {}

// elsewhere
export default function rootReducer(state = initialState, action) {
  const postState = postsReducer(state.post, action);
  const {hasPostReallyBeenAdded} = postState;
  const commentState  = commentsReducer(state.comments, action, hasPostReallyBeenAdded);
  return { post : postState, comments : commentState };
}