当子状态中的字段值发生变化时,redux 会更改 rootState 对象的引用吗?

does redux change the reference of rootState object when a field's value in a sub state changes?

我的 redux 状态设置是这样的

rootState
     subState1
          field1
          field2
     subState2
          field1
          field2

根状态内的多个子状态。如果我发送一个动作来改变 subState1 中的 filed2,redux 会改变整个 rootState 对象(rootState 在内存中的位置)吗?如果这样做,这将是一项性能密集型任务。 当我有一个大商店时,使用 redux 就没有意义了 因为每次更改都会替换 rootState 对象。

  "dependencies": {
    "@reduxjs/toolkit": "^1.8.1",
    "react-redux": "^8.0.1",
  }

是的,根状态对象总是被替换,因为这是不可变更新的基本原则:不可变更新需要复制每个层的嵌套到需要更新的字段!

换句话说,如果我需要更新state.a.b.c.d,我必须写这样的代码:

return {
  ...state,
  a: {
    ...state.a,
    b: {
      ..state.a.b,
      c: {
        ...state.a.b.c,
        d: newValue
      }
    }
  }
}

不过,我认为您是认真的 over-estimating 这里的“性能”含义。当然,每个 JS 操作都有成本,其中包括复制对象。但是,复制 root 状态(即 {...state})通常几乎没有成本,因为复制单个对象的成本是 O(numFields)。换句话说,复制一个有 5 个字段的对象比复制一个有 50,000 个字段的对象要快......而且 Redux 根状态对象通常可能有 5-20 top-level 个切片(即 {users, posts, comments, todos, counter},等)。

通常,reducer 不是 Redux 应用程序中的性能瓶颈。并不意味着它们从来没有性能问题。但大多数时候,真正重要的是更新 UI 的成本。

此外,根据您关于“想知道幕后发生的事情”的评论:

剧透:

没有任何“幕后”! :)

通常,实际上 在减速器中重要的所有逻辑 都是您自己编写的代码redux 核心库中唯一在这里发挥作用的代码是 combineReducers 函数,它只是在帮助复制和更新根状态对象。