我应该在商店中存储永不更改(自举)的数据吗?

Should I store never changing (bootstrapped) data in the store?

我的应用程序中有一些状态来自服务器并且不会改变(在用户会话的生命周期内)。此状态在 HTML 中启动。

我应该将它作为商店的一部分合并到减速器中吗? const bootstrappedData = (state, action) => state

或者我应该公开一些像 bootstrappedData.get('key') 这样的全局助手吗?

有趣的是,就在昨天,我对自己商店中的数据做出了同样的决定。我得出的结论是,我们应该只在 Redux 存储中存储 stateful 数据,即能够保持状态的数据,或者可能发生变化的数据。根据定义,静态数据没有状态,因此不需要像这样进行跟踪。

因此,我通常有一个 /common/app-const.js 文件来存储这些类型的静态对象。例如,我在这里存储了 Redux 的 DEFAULT_STATE,但也存储了一些其他不会更改的对象(因此不会在 Redux 中进行跟踪)。

现在假设我实际上想要允许最终用户在 UI 中操作 numRowsnumCols,那么在这一点上我肯定需要将它们放入Redux 商店,但不是现在,因为它们只是静态常量!

/common/app-const.js

export const DEFAULT_STATE = {
    model: {},
    timer: {
        isRunning: false,
        ticks: 0
    }
};

export const GRID_DATA = {
    numRows: 50,
    numCols: 75,
};

每当我需要这些静态数据时,它就像导入一样简单:

import { GRID_DATA } from '../common/app-const';

与这个问题稍微相关的是异步(非自举)而是静态数据,

为此,将数据存储在商店中与在商店外进行权衡。


店内

优点

  • 无需使用 console.log
  • 即可轻松查看和调试数据
  • 查询数据是通过选择器同步的

缺点

  • 概念不准确,因为根据定义静态数据不是有状态的,而存储是为了保存状态

店外

优点

  • 概念准确(基于

缺点

  • 由于数据是异步的,您必须导出异步数据访问 API(相对于同步选择器)
  • 异步数据导致有状态组件(在生命周期钩子中获取数据并将数据设置为状态,例如)

我在一个大型生产应用程序中采用了前一种方法,回想起来更愿意采用后者。