【问题标题】:How to deep update two values inside Immutable Js Map in redux?如何在 redux 中深度更新 Immutable Js Map 中的两个值?
【发布时间】:2018-02-19 15:48:46
【问题描述】:

我正在尝试更新 items 内的两个(widthx)值 -> yrgroih9 如下所示:

{
  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的值。

在 setIn 之后排列的 Redux 存储数据:(来自 chrome redux devtools):

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

【问题讨论】:

    标签: reactjs redux updates immutable.js


    【解决方案1】:

    使用updateIn

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

    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,
        })
      );
    

    【讨论】:

      【解决方案2】:

      state.setIn 替换您给定路径中的整个对象(appElements -> 图层 -> layer_1 -> 项目 -> 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);
      

      【讨论】:

      • 您的代码在第一行显示Uncaught TypeError: Cannot read property 'layers' of undefined
      • 好的,这是因为您最初的状态中没有 appElements。尝试检查它是否存在 (state.hasIn(["appElements", "layers", ....])),如果不只是将 oldObject 分配给空 (oldObject = {})
      • @ArunValaven 我已经更新了检查值是否存在的答案。
      • 嗯.. 试试 state.getIn(["appElements","layers","layer_1","items","yp57m359"]) 而不是 state.appElements.layers.layer_1.items。 yp57m359
      • 还尝试了getIn,它添加了不相关的数组:vsize _root-> ownerID entries -> entries[0]->["100x","width"] entries[1]->["200x", "width"] 条目[2]->["200x","width"] __改变的宽度 x 在 "yp57m‌​359" 键内
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 2022-01-17
      • 1970-01-01
      • 2021-07-08
      • 2016-09-20
      相关资源
      最近更新 更多