鉴于我最初的redux状态是:

const state = {
  currentView: 'ROOMS_VIEW',
  navbarLinks: List([
    {name: 'Rooms', key: 'ROOMS_VIEW'},
    {name: 'Dev', key: ''}
  ]),
  roomListsSelected: {group: 0, item: 0},
  roomLists: [
    {
      name: "Filters",
      expanded: true,
      listItems: [
        { icon: 'images/icon-warning.svg', name: 'Alerts', filter: room => room.hasAlert },
        { icon: 'images/icon-playlist.svg', name: 'In Progress', filter: room => room.progress > 20 },
        { icon: 'images/icon-playlist.svg', name: 'Almost Done', filter: room => room.progress > 90 },
        { icon: 'images/icon-playlist.svg', name: 'Complete', filter: room => room.status === 'complete' },
        { icon: 'images/icon-playlist.svg', name: 'Recently Completed', filter: room => false },
        { icon: 'images/icon-playlist.svg', name: 'All Rooms', filter: room => true }
      ]
    }
  ],
  rooms: List(generateRooms())
}

我需要做一个减速器,它可以:

state.roomList[n].expanded = !state.roomList[n].expanded

我不熟悉使用Redux工作流,解决这个问题的最佳方法是将roomList设置为不可变.js对象或编写一些代码来深度克隆我的状态对象.

还声明.roomList将有来自future 功能的新数据.

Summery / Question:当在状态中进行如此深度的更改时,在reducer中返回新状态对象的最佳方式是什么,还是应该更改Redux状态对象的 struct ?

What I did最后,不变似乎是一条路要走.使用Immutable可以减少react渲染时间,并满足所有项目要求.此外,在项目中使用一个新的库而不进行重大更改也为时过早.

推荐答案

首先,惯用的Redux鼓励您"规范化"您的状态,并尽可能地将其扁平化.使用由项目ID设置关键字的对象来允许直接查找项目,使用ID数组来表示排序,并且在一个项目需要引用另一个项目的任何地方,它只存储另一个项目的ID,而不是实际数据.这允许您对嵌套对象进行更简单的查找和更新.见the Redux FAQ question on nested data.

此外,看起来您目前正在Redux状态下直接存储许多函数.Technically这是可行的,但它肯定不是惯用的,并且会 destruct 时间旅行调试等功能,因此非常不鼓励使用它.Redux常见问题解答提供了有关why storing non-serializable values in your Redux state is a bad idea的更多信息.

编辑:

作为后续行动,我最近在Redux文档中添加了一个新的部分,主题是"Structuring Reducers".特别是,本节包括关于"Normalizing State Shape""Updating Normalized Data"以及"Immutable Update Patterns"的章节.

Reactjs相关问答推荐

InfiniteScroll持续获取数据,直到超过最大更新深度

使用REACT-RUTER-V6和ZUSTANDreact 中的身份验证

如何使图像zoom 并移动到点击点

如何使用Reaction Testing Library+Vitest正确更新单元测试中的输入?

在Reaction中的第一次装载时,Use Effect返回空数组

使用Next.js和Next-intl重写区域设置

点击页脚链接时,如何更改ReactJS导航栏中的活动菜单项(样式为Tailwind CSS)?

设置自定义形状的纹理

Mui Datepicker 设置了错误的日期

如何在PrimeReact的表格中修改筛选图标功能

React Native 背景动画反转

React - 将一个充满空值的无限大小的数组存储在 ref 中是否可以,或者我应该重置数组吗?

计数器递增 2 而不是 1

Suspense/Await - 解析数据加载/保存到状态后无限循环

如何在 ReactJS 中提交后删除 URL 中的查询参数

我可以更改 styled() 中的响应吗? (MUI v5)

NextJS htaccess 设置

Cypress - 在继续之前等待下一个按钮重新出现

ReactJS:按钮启用禁用更改 colored颜色

bootstrap 导航栏切换器在 reactjs 中不起作用