【问题标题】:immutable js update deep structure不可变 js 更新深层结构
【发布时间】:2016-08-02 17:03:44
【问题描述】:

我在尝试更新我的结构时遇到“无效的密钥路径”错误:

state = fromJS({
  cmsData: {
    "pages": [
      {
        "name": "page1",
        "content": {
          "header": "Example header",
          "intro": "Example intro",
          "body": "Example body",
        }
      }
      ...
}

我正在尝试使用以下方法更新 pages 数组中的值:

state.setIn(['cmsData', 'pages', index, 'content', title], value)

index 是一个数字,title 是一个字符串,value 也是一个字符串。

我可以通过以下方式创建一个新项目:

state.setIn(['pages', index, 'content', title], value)

但是,一旦我尝试访问主“cmsData”对象,就会出现错误。

-----更新------

我最初设置的是 cmsData 对象,而不是初始状态

state.set('cmsData', data)

如果我确实将对象作为初始状态,它工作正常。但是在设置后尝试更新会产生无效的密钥路径

-----解决方案-----

我没有设置初始数据,而是使用了 mergeDeep !

state.mergeDeep({ 'cmsData': data })

【问题讨论】:

    标签: javascript reactjs redux immutability immutable.js


    【解决方案1】:

    您的新项目创建 setIn 似乎忽略了cmsData 级别。不知道为什么这会影响其他访问,但也许你没有创建你认为你拥有的东西,所以当该项目在该 keypath 中不存在时(即在 cmsData 中)会出错

    【讨论】:

      【解决方案2】:

      请您再检查一遍好吗?我试过你的代码,它似乎工作正常。

      var state = Immutable.fromJS({
          cmsData: {
         "pages": [
            {
              "name": "page1",
              "content": {
                "header": "Example header",
                "intro": "Example intro",
                "body": "Example body",
              }
          }
        ]
       }});
      

      我刚刚执行了这个语句,它返回了一个预期的对象。

      这里是link to jsbin

      【讨论】:

      • 查看更新了解更多信息!我实际上是在尝试更新之前设置 cmsData 对象,而不是该对象是初始状态。抱歉说的不是很清楚!
      【解决方案3】:

      我没有设置初始数据,而是使用了mergeDeep!

      state.mergeDeep({ 'cmsData': data })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多