javascript - Redux 推送到嵌套数组而不改变状态

标签 javascript reactjs ecmascript-6 redux react-redux

我有一个如下所示的状态对象:

PlaylistDictionary: {
  someId: {
    pages: []  // trying to push something to this array here
  },
  someId2: {
    pages: []  // trying to push something to this array here
  }, etc
}

我正在尝试更新“pages”数组,但我不断收到错误消息,说我正在改变状态..我不明白,因为如果我使用 Object.state 复制状态对象。分配...我如何改变状态?感谢您的帮助

case types.ADD_PAGE_TO_PLAYLIST: {
  let playlistDictCopy = Object.assign({}, state.playlistDict );

  if ( !playlistDictCopy[ action.playlistId ].hasOwnProperty('pages') ) {
    playlistDictCopy[ action.playlistId ].pages = [];
  }

  playlistDictCopy[ action.playlistId ].pages.push( action.pageId );

  return Object.assign( {}, state, { playlistDict: playlistDictCopy } );
}

最佳答案

您正在制作状态对象的浅拷贝,您根本没有复制任何属性值,包括数组本身,因此您正在改变数组。

您的 .push 调用会更改数组,并且由于您尚未创建新数组,因此这也会影响所有先前存储的状态对象。

你可以做到

playlistDictCopy[ action.playlistId ].pages = playlistDictCopy[ action.playlistId ].pages.concat([action.pageId]);

playlistDictCopy[ action.playlistId ].pages = [ ...playlistDictCopy[ action.playlistId ].pages, action.pageId]);

创建一个新数组。

关于javascript - Redux 推送到嵌套数组而不改变状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45655542/

相关文章:

mvvm - Vue 1.x/2.x : Get vue-router path url from a $route object

javascript - 在 React js 中使用 Reactstrap 从多个选择下拉列表中动态选择选项

reactjs - 状态在钩子(Hook)返回的函数内保持不变

javascript - ECMA-262 ReturnIfAbrupt

javascript - 使用 yii2 框架-vis.js 库的时序图

javascript - 如何使用react改变按钮的背景颜色

Javascript/ES2015,计算出现次数并将其存储为数组中的对象

javascript - HTML:选择多个文件但没有显示文件名?

php - Wordpress:如果我想从 javascript 文件调用我的 php 脚本,该把它放在哪里?

javascript - View 和 View 模型必须位于同一位置吗