如何在 redux 中深度更新 Immutable Js Map 中的两个值?

How to deep update two values inside Immutable Js Map in redux?

我正在尝试更新 items -> yrgroih9 中的两个(width & x)值,如下所示:

{
  appElements: {
    layers: {
      layer_1: {
        background: {
          width: '100px',
          height: '100px',
          bgColor: '#aaaaaa',
          bgImage: 'http:bgimage1.png'
        },
        items: {
          yrgroih9: {
             width: '100px',
             x: '200px',
             y: '200px'
           },
           qhy0dukj: {
             width: '100px',
             x: '200px',
             y: '200px'
           },
           '7lw2nvma': {
             width: '100px',
             x: '200px',
             y: '200px'
           }
        }
      }
    }
  }
}

用于更新内部新对象的代码 items-> yrgroih9:

case 'UPDATE_OBJECT':
  return state.setIn(["appElements","layers","layer_1","items","yp57m359"],{
    ["width"]: action.objData.width,
    ["x"]: action.objData.x
  });

以上代码删除当前位置 yrgroih9 内的 y 键并更新 widthx 值。

redux store 数据排列在setIn之后:(来自chrome redux devtools):

如何在不删除其他键值的情况下更新两个深度值。?

state.setIn 替换您指定路径中的整个对象 (appElements -> layers -> layer_1 -> items -> yp57m359)。您可以获取现有对象,修改字段,然后使用 setIn:

const oldObject =
 state.hasIn(["appElements","layers","layer_1","items","yp57m359"])
   ? state.getIn(["appElements","layers","layer_1","items","yp57m‌​359"])
   : {};
const newObject = {
  ...oldObject,
  width: action.objData.width,
  x: action.objData.x
};
return state.setIn(["appElements","layers","layer_1","items","yp57m359"], newObject);

使用updateIn.

如果您的项目是 Immutable.js 地图的实例:

case 'UPDATE_OBJECT':
  return state.updateIn(['appElements', 'layers', 'layer_1', 'items', 'yrgroih9'],
    (item) => item
      .set('width', action.objData.width)
      .set('x', action.objData.x)
  );

如果您的项目是纯 JS 对象:

case 'UPDATE_OBJECT':
  return state.updateIn(['appElements', 'layers', 'layer_1', 'items', 'yrgroih9'],
    (item) => ({
      ...item,
      width: action.objData.width,
      x: action.objData.x,
    })
  );