请注意:我已经阅读了Redux(Baobab)的文档,我也做了相当一部分的Google&测试.

Why is it so strongly suggested that a Redux app have only one store?

我了解单店设置与多店设置(There are many Q&A on SO on this subject)的优缺点.

在我看来,这个架构决策属于基于项目需求的应用程序开发人员.那么,为什么对Redux如此强烈地建议,几乎到了听起来是强制性的(though nothing is stopping us from making multiple stores)?

EDIT: feedback after converting to single-store

在与ReDux合作的几个月后,许多人会认为这是一个复杂的SPA,我可以说单store 的 struct 是一个纯粹的乐趣.

以下几点可能会帮助其他人理解为什么单一store 与多家store 在许多用例中是一个没有意义的问题:

  • it's reliable:我们使用 Select 器挖掘应用程序状态并获取上下文相关信息.我们知道所有需要的数据
  • it's fast:我们store 目前有近it's fast个减速机,如果不是更多的话.即便如此,也只有少数还原程序处理数据
  • debugging friendly:虽然这是使用redux作为一个整体的最有说服力的论点,但它也适用于单一store 与多个store store .在构建应用程序时,您必然会在 流程(programmer mistakes),这是正常的.皮塔是指当那些 调试错误需要数小时.多亏了单一的store (and redux-logger),我们从来没有在任何给定的东西上花费超过几分钟的时间 州政府的问题.

a few pointers

建立reduxstore 的真正挑战是决定如何使用它.首先,因为改变 struct 只是一个巨大的痛苦.其次,因为它在很大程度上决定了你将如何使用和查询你的应用程序数据.关于如何组织store ,有很多建议.在我们的 case 中,我们发现以下是理想的:

{
  apis: {     // data from various services
    api1: {},
    api2: {},
    ...
  }, 
  components: {} // UI state data for each widget, component, you name it 
  session: {} // session-specific information
}

希望这个反馈能帮助其他人.

编辑2-有用的存储工具

对于那些一直想知道如何"轻松"管理single store的人来说,这可能很快就会变得复杂.有一些工具可以帮助隔离存储的 struct 依赖项/逻辑.

Normalizr个基于模式对数据进行规范化.然后,它提供了一个接口来处理数据,并通过id获取数据的其他部分,就像字典一样.

由于当时不知道normalizer,我按照同样的思路构建了一些东西.relational-json接受一个模式,并返回一个基于表的接口(a little like a database).关系型json的优点是,您的数据 struct 动态地引用数据的其他部分(essentially, you can traverse your data in any direction, just like normal JS objects).它不像normalizer那么成熟,但我已经成功地在生产中使用了几个月了.

推荐答案

当您可能使用多个存储时,会出现一些边缘情况(例如,如果您在每秒多次更新屏幕上数千个项目的列表时出现性能问题).也就是说,这是一个例外,在大多数应用中,你只需要一个store .

为什么我们要在文件中强调这一点?因为大多数来自Flux背景的人都是assume multiple stores is the solution to making update code modular. However Redux has a different solution for this: reducer composition.

将多个减速器进一步拆分成一个减速器树是您在Redux中保持更新模块化的方式.如果你没有意识到这一点,在没有完全了解减速机组成的情况下go 多家门店,你就会错过Redux单门店架构的许多好处:

  • 使用reducer composition,可以通过手动编写reducer并以特定顺序调用其他reducer,从而在Flux中实现la waitFor的"依赖更新".

  • 使用单个存储,很容易持久化、加水和读取状态.服务器呈现和数据预取是微不足道的,因为客户端只需要填充和恢复一个数据存储,而且JSON可以描述其内容,而不必担心store 的ID或名称.

  • 一家store 就可以实现Redux DevTools的时间旅行功能.它还使诸如redux undo或redux Optimit之类的社区扩展变得容易,因为它们在reducer级别上运行.这种"还原剂增强剂"不能用于store .

  • 单个存储区保证仅在处理分派之后才调用订阅.也就是说,在通知侦听器时,状态已经完全更新.对于许多store ,没有这样的保证.这是Flux需要waitFor根拐杖的原因之一.对于单一的store ,这不是你首先看到的问题.

  • 最重要的是,在Redux中不需要多个存储(性能优势情况除外,您应该首先分析这些情况).我们在文档中强调了这一点,因此鼓励您学习reducer composition和其他Redux模式,而不是像使用Flux一样使用Redux,从而失go 它的好处.

Javascript相关问答推荐

VMWHTMLWebMKS-控制台连接良好,但没有屏幕且占用率高

为什么我的useDispatch挂钩在这里设置不正确?

如何使用JavaScript对切换的声音设置音量

将未等待的未处理的错误promise 转变为警告@ changeTicksAndRejections(由当时的抛出错误创建)

使用JavaScript更改json值顺序

React Hooks中useState的同步问题

JS生成具有给定数字和幻灯片计数的数组子集

使用axios.获取实时服务器时的404响应

未捕获错误:在注销后重定向到/login页面时找不到匹配的路由

JS—删除对象数组中对象的子对象

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

在执行异步导入之前判断模块是否已导入()

从页面到应用程序(NextJS):REST.STATUS不是一个函数

覆盖加载器页面避免对页面上的元素进行操作

未加载css colored颜色 ,无法将div设置为可见和不可见

如何在Java脚本中对列表中的特定元素进行排序?

MongoDB中的嵌套搜索

自动滚动功能在当前图像左侧显示上一张图像的一部分

JavaScript将字符串数字转换为整数

每隔3个项目交替显示,然后每1个项目交替显示