鉴于我的初始还原状态为:
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设置为immutable.js对象或编写一些代码以对我的状态对象进行深层克隆。
state.roomList还将从将来的功能中推送新数据。
总结/问题: 在状态深处进行此类更改时,在reducer中返回新状态对象的最佳方法是什么,还是应该更改Redux状态对象的结构?
*最后, *我所做 的不可变似乎是要走的路。Immutable有一些技巧可以减少反应渲染时间,并且可以满足所有项目要求。同样,在项目中尽早使用新库而不进行重大更改也是足够的。
首先,惯用的Redux鼓励您“规范化”您的状态并将其尽可能扁平化。使用以项目ID为关键字的对象可以直接查找项目,使用ID数组表示顺序,并且在一个项目需要引用另一个项目的任何地方,它仅存储另一个项目的ID而不是实际数据。这使您可以更简单地查找和更新嵌套对象。请参阅有关嵌套数据的Redux FAQ问题。
另外,看起来您当前正在Redux状态下直接存储许多函数。 从技术上讲 ,这是可行的,但绝对不是惯用语言,并且会破坏时间旅行调试等功能,因此不建议使用。Redux FAQ提供了更多信息,说明为什么在Redux状态下存储不可序列化的值是个坏主意。
编辑:
作为后续,我最近在Redux文档中添加了一个新主题,主题为“ Structuring Reducers”。特别地,本节包括有关“规范化状态形状”和“更新规范化数据”以及“不可变更新模式”的章节。