如何为高度 de-coupled、plug-n-play 复杂的组件构建 Redux?

How to structure Redux for a highly de-coupled, plug-n-play complex component?

我是 Redux 的新手,想在我的应用程序中使用它,但我在 Redux 部分停留在 architecture/design 阶段。这是我对设计的要求和假设。

申请详情: 与 AngularJS 的 SPA。使用的其他库 ng-redux, reselect, rxjs.

组件详细信息: Re-usable 用于呈现大量数据的网格组件。

我的想法: 创建一种 plug-n-play 类型的 component-based 架构,其中网格的所有内部组件都独立于 parent/composing 组件,例如搜索、排序、行、header、单元格。

  1. 所有组件都将有自己的 reducer、action、selector 和来自 store 的状态切片。

  2. 因为所有的组件都有自己的reducer,可以plugged-in按需使用,所以我需要将它们懒惰地注册到store,而不是堆积在一个地方。

  3. 一些组件如搜索、排序以及它们自己的状态,也会影响其他组件的状态。例如:设置查询参数(searchText、sortOrder 等)以获取将由另一个组件处理的网格数据。

我的想法:

  1. 对于第 1 点,我正在研究 reselect 以提供状态的相关切片。

  2. 对于第二点,我仍然很困惑使用combineReducers/replaceReducer登记。如果我想访问状态的多个部分,我觉得 combineReducers 不适合。

  3. 对于第3点,我正在考虑以下方法:

    一个。在需要更新状态的多个部分时,通过 getState() 传递整个状态。虽然这种方法让我感觉 Redux 使用不当。

    b。组件 A 触发它自己的动作,更新它们的状态部分,然后另一个动作触发另一个组件 B 更新它的状态片.这种方法也感觉像是打破了 Redux 的整个思想,side-effect 的概念可以在这里使用,虽然我不知道如何使用它,也许 redux-saga,redux-thunk

注意:使用任何一种方法都不应该导致组件了解其他组件,因此无论必须做什么,都将通过传递通用配置来完成object 喜欢 { actionsToFire: ['UPDATE_B'] }.

  1. 我在应用程序页面之间来回导航时需要状态管理,但我不需要 hot-reloading、action-replay 或 pre-fetching来自 server-side.

  2. 的应用程序状态
  3. 组件也将负责在不再需要时销毁它们的状态。并且状态将具有规范化结构。

我知道这些要求可能看起来很奇怪或 not-seen-often 但我会保持这样。

我已经知道的几件事是:

  1. 我不需要像 Dan 的经典文章中所说的那样使用 Redux,但我认为在这种情况下我需要它。

  2. 我知道 Smart 和 Dumb 组件,大部分我的组件可能看起来很智能(即知道应用程序状态),但这就是我想要保留它们的方式,我可能错了。

网格组件示意图:

Grid Component Diagram

Redux 的全局存储使得封装和动态即插即用行为变得更加困难,但这是可能的。实际上有many existing libraries for per-component-instance state and dynamic registration of reducers。 (也就是说,到目前为止,我看到的用于组件管理的库是 React 库——您必须研究其中的一些并自己重新实现一些东西才能与 Angular 一起使用。)