为什么要求始终返回具有新内部引用的新对象
Why is the requirement to always return new object with new internal references
Redux 要求总是从化简器返回新状态。例如,我有以下状态:
let initialState = {
prop: 3,
internalReferenceProp: {a:3}
}
以及修改internalReferenceProp
的减速器.这个化简器可以实现为仅更改对象引用state
或同时更改state
和internalProperty
:
function(state=initialState, action) {
// changing only state reference
let newState = Object.assign({}, state);
newState.internalReferenceProp.a = 7;
return newState;
// changing both state and internalReferenceProp reference
return Object.assign({}, state, {internalReferenceProp: {a:7}})
}
正如我被告知第一种方法不正确的那样,所以我的问题是要求更改内部引用背后的原因是什么?我知道我应该更改state
引用,因为它可以轻松比较以检测state
是否更改,但为什么要更改内部引用?
第一个显然是不正确的,因为Object.assign
做的是浅拷贝,而不是深拷贝。
// changing only state reference
let newState = Object.assign({}, state);
newState === state // false
newState.internalReferenceProp === state.internalReferenceProp // true
state.internalReferenceProp.a // 3
newState.internalReferenceProp.a = 7 // 7
state.internalReferenceProp.a // 7
你可以看到,如果我们在newState
中改变某些东西,它也会在state
中改变。如果组件仅对internalReferenceProp
感兴趣,这将使更改无法检测到。这也称为"副作用",是一种不好的做法。
简而言之,如果您的输入(在这种情况下state
(以任何方式发生变化,则称为副作用,并且在 redux 中是错误的。
以下是为什么这很糟糕的示例:
let data = getData(); // from redux
return (
<ChildComponent someProp={data.internalReferenceProp} />
);
如果我们使用带有副作用的版本,ChildComponent
永远不会重新渲染,因为它的道具没有改变。 oldData.internalReferenceProp === newData.internalReferenceProp
.
相关文章:
- 如何使用object.assign()从其他对象引用基本对象属性
- 查找关键字并创建新对象
- 创建新对象时,为什么要更新旧对象
- 为什么要使用立即调用的函数来创建新对象
- 返回 JavaScript 类值而不是对象引用
- 剑道网格-插入具有外部列的新对象失败
- Facebook:当发布期望对象引用时显示打开的图形对话框
- 将原型调用为新对象中的另一个原型
- 将新对象添加到本地存储
- $$hashKey在Angular中push()新对象时未生成新值
- 为什么可以't在创建新对象时引用旧对象
- 在Javascript中使用新的引用创建一个新对象 - 不要复制或克隆 -
- 停止对作为函数参数传递到新列表的对象引用
- 同步代码框 - 调用 API - 解析 JSON - 获取引用 - 保存新对象
- JavaScript Scope:引用任意新对象的计时器
- 为什么要求始终返回具有新内部引用的新对象
- 创建新对象,而不是引用
- 一个实例的对象和数组被主干模型的新实例引用
- 赋值一个新对象并保持引用
- 将对象属性复制到新对象属性 - 而不是通过引用