最佳实践:使用 Redux 处理只读数据

Best Practice: Handle read-only data with Redux

我正在使用 React 和 Redux 构建应用程序,我对设计有疑问。

我的应用程序使用 React Router。它有一个导航栏(在左侧),显示来自 React Router 配置文件的路由和 Material 设计菜单。

我想知道处理此 LeftNav 组件的静态数据的最佳做法是什么。

此数据具有以下形状:

const menuItems = [
  {
    icon: 'home',
    label: 'Home',
    url: '/home',
    withDivider: true,
    access: 'all',
  },
  {
    icon: 'settings',
    label: 'Settings',
    url: '/settings',
    access: 'admin',
  },
  {
    icon: 'power_settings_new',
    label: 'Log Out',
    url: '/logout',
    access: 'user',
  },
];

为了尊重 smart and dumb component proposal,我的 LeftNav 组件是无状态的。 我还有一个智能组件(现在它只是我的 AppContainer),它呈现 LeftNav 组件并通过 props 向其提供 menuItems 数组。

我想知道我是否必须将这个只读数据包含到我的 redux 状态树中。在这种情况下,我会有一个像这样的常量减速器:

export default handleActions({}, [
  {
    icon: 'home',
    label: 'Home',
    url: '/home',
    withDivider: true,
    access: 'all',
  },
  {
    icon: 'settings',
    label: 'Settings',
    url: '/settings',
    access: 'admin',
  },
  {
    icon: 'power_settings_new',
    label: 'Log Out',
    url: '/logout',
    access: 'user',
  },
]);

没有动作处理程序的常量减速器是一个好习惯吗?如果不是,我该怎么办?

提前致谢。

我不明白你的减速器是如何工作的。什么是 handleActions

我认为常量 reducer 似乎是一个合理的解决方案,但我会使用默认的第一个参数来实现它。假设您正在使用 combineReducers 将所有减速器的范围限定在它们控制的状态部分,我会做类似的事情:

/* reducers.js */

const menuItemsInitialState = [
  {
    icon: 'home',
    label: 'Home',
    url: '/home',
    withDivider: true,
    access: 'all',
  },
  {
    icon: 'settings',
    label: 'Settings',
    url: '/settings',
    access: 'admin',
  },
  {
    icon: 'power_settings_new',
    label: 'Log Out',
    url: '/logout',
    access: 'user',
  },
];

export function menuItems(state = menuItemsInitialState, _) {
  return state;
}

就我个人而言,我更喜欢我的减速器专注于处理应用程序/系统范围的状态。您的示例中的配置作为使用它的组件中的常量会感觉更自在 (LeftNav?)

@Cnode 我同意@acjay 它应该处于减速器状态,即使没有动作创建者。

我会更进一步,建议您应该在应用加载后获取数据,而不是将数据包含在您构建的文件中。通常数据不属于内置文件

这是因为,在现实世界中,这个特定的集合(以及其他集合 - 可能更大的集合)将在 API 上静态可用,因为您可能希望 CMS 可以配置这些值。

  1. 添加一个静态减速器来承载这个状态
  2. 在应用程序初始化后获取数据,然后将其推送到状态 - 这意味着您将至少有一个动作创建者。