javascript - 为什么要求总是返回带有新内部引用的新对象

标签 javascript redux redux-framework

Redux 要求始终从 reducer 返回新状态。例如,我有以下状态:

let initialState = {
   prop: 3,
   internalReferenceProp: {a:3}
}

以及修改internalReferenceProp的reducer。可以实现此 reducer 以仅更改 state 对象引用或同时更改 stateinternalProperty:

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

关于javascript - 为什么要求总是返回带有新内部引用的新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34516894/

相关文章:

javascript - 可以用 `onEnter` 延迟组件渲染吗?

javascript - 有没有办法通过 React-Native (JS) 预打包 Realm 数据库 (default.Realm)

reactjs - mapStateToProps 根本没有被调用

javascript - react 组件DidMount "Parsing error: Missing semicolon"

php - Wordpress Redux 框架媒体查询

php - wordpress如何在数组中添加wp_editor

reactjs - React-redux 交叉访问状态值

javascript - 如何使用 jquery 翻转动态添加的图像?

javascript - YouTube 视频 API 片段标题包含 Next.js 中的特殊字符

javascript - 如何在 AngularJS 中为 $http promise 创建单元测试