当前位置: 首页 > 知识库问答 >
问题:

React-Redux复杂(深度)状态对象

蒋昊天
2023-03-14

鉴于我的初始重复状态为:

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对象或编写一些代码来深度克隆我的状态对象。

此外state.room列表将从未来的功能中向其推送新数据。

总结/问题:当在状态中进行如此深入的更改时,在reducer中返回新状态对象的最佳方式是什么,还是应该更改Redux状态对象的结构?

我所做的最终不变似乎是一条路。有一些技巧与不可变的减少反应渲染时间,它满足所有的项目要求。此外,在项目中使用一个新的库而不进行重大更改是足够早的。

共有2个答案

司知
2023-03-14

减速器组合:将减速器分解为更小的部分,这样减速器就足够小,可以处理简单的数据结构。在您的情况下,您可能有:roomListReducerlistItemsReducerlistItemReducer。然后在每个减速机上,它将使您更容易阅读您正在处理的状态的哪一部分。这很有帮助,因为您的每个reducer都在处理一小段数据,您不必担心诸如“我应该深度复制还是浅层复制”之类的问题。

不可变我个人不使用不可变。js因为我更喜欢处理普通对象。为了采用新的API,需要修改的代码太多了。但是,我们的想法是,确保状态更改总是通过纯函数完成的。因此,您只需编写自己的helper函数即可完成所需操作,只需确保在处理复杂对象时对其进行彻底测试即可。

或者简单地说,您可以在每个reducer中深度复制您的状态,并在副本中进行变异,然后返回副本。但这显然不是最好的办法。

杭昊空
2023-03-14

首先,惯用的Redux鼓励您“规范化”您的状态,并尽可能将其平坦化。使用由项目ID设置关键字的对象来允许直接查找项目,使用ID数组来表示顺序,并且在一个项目需要引用另一个项目的任何地方,它只存储另一个项目的ID而不是实际数据。这允许您对嵌套对象进行更简单的查找和更新。请参阅有关嵌套数据的Redux常见问题解答问题。

另外,看起来您当前正在Redux状态下直接存储许多函数。从技术上讲,这是可行的,但它肯定不是惯用的,并且会破坏诸如时间旅行调试之类的功能,因此它非常不受欢迎。Redux常见问题解答提供了一些关于为什么在Redux状态中存储不可序列化的值是个坏主意的更多信息。

编辑:

作为后续工作,我最近在Redux文档中添加了一个新的部分,主题是“构造减缩器”。特别是,本节包括关于“规范化状态形状”和“更新规范化数据”以及“不可变更新模式”的章节。

 类似资料:
  • 鉴于我的初始重复状态为: 我需要做一个减速器,它可以: 我不熟悉使用Redux工作流,解决这个问题的最好方法是将roomList设置为不可变的。js对象或编写一些代码来深度克隆我的状态对象。 此外state.room列表将从未来的功能中向其推送新数据。 总结/问题:当在状态中进行如此深入的更改时,在reducer中返回新状态对象的最佳方式是什么,还是应该更改Redux状态对象的结构? 我所做的最终

  • 问题内容: 当我声明以下初始状态时: 我用这样更新状态: 结果对象仅定义了年龄。但据我所知,将其参数合并到现有状态。为什么它在这里不起作用,这不是应该经常合并吗? 有没有办法在React / ES6中将新对象属性合并为状态对象属性? 问题答案: 执行浅合并。如果metaData是平坦的: 或者使用点差:

  • 我试图做一个登录表单,它需要我迁移我的soloreac应用程序在反应redux应用程序。我面临许多错误,并坚持与。我是这方面的新手,任何帮助都会得到重视。 指数js文件 应用程序。js文件: 我得到这个错误。我不明白是什么文件或代码导致了这个错误。 类型错误:存储。getState不是新提供程序节点的函数\u modules/react redux/es/components/Provider。j

  • const[number, setNum]=useState(0);当我想添加和更改它时,我收到了这个错误(setNum(number 1))。我的错误:超过了最大更新深度。当组件在组件WillUpdate或组件DiUpdate中重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量以防止无限循环。我能做些什么来解决这个问题?

  • 我正在尝试学习React(使用redux),所以我正在制作一个应用程序,在其中我可以创建训练计划,将训练添加到计划中,然后将训练添加到训练中。 PlanListComponent 我的PlansList组件为每个计划呈现一张卡片。在这张卡片中,它为该计划中的每个训练呈现一个训练列表。将训练添加到计划后,“计划列表”组件不会重新渲染。添加的训练仅在我刷新页面后显示。我之所以选择这种情况,是因为我必须

  • 我已经查看了其他各种StackOverflow答案,它们都与我的讲师在幻灯片中写的不同。 深度优先搜索的时间复杂度为O(b^m),其中b是搜索树的最大分支因子,m是状态空间的最大深度。如果m比d大得多,这很糟糕,但如果搜索树“浓密”,则可能比广度优先搜索快得多。 他接着说。。 空间复杂度为O(bm),即动作序列长度的空间线性!只需要存储从根到叶节点的单个路径,以及路径上每个节点的剩余未扩展兄弟节点