当子状态中的字段值发生变化时,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
函数,它只是在帮助复制和更新根状态对象。
我的 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
函数,它只是在帮助复制和更新根状态对象。