【问题标题】:Updating a nested array in reducer in Redux在 Redux 的 reducer 中更新嵌套数组
【发布时间】:2017-02-26 23:51:57
【问题描述】:

我正在尝试更新减速器中对象数组中的特定索引。状态有一个对象数组。 isSearch 是对象的一个​​属性。在操作的有效负载中,我传递要更新的索引和值。这是我的代码:

case actions.UPDATE:
  return {
    ...state,
    arrObj: {
      ...state.arrObj,
      arrObj[action.payload.index].isSearch : action.payload.isSearch,
    },
  };

我收到此错误Unexpected token, expected , at arrObj[action.payload.index]. 有人可以告诉我如何纠正这个错误吗?

【问题讨论】:

  • 那么arrObj[action.payload.index].isSearch : action.payload.isSearch, 应该是什么意思?
  • @zerkms 我正在为 arrObj[action.payload.index] 对象分配一个属性 isSearch

标签: javascript reactjs ecmascript-6 redux


【解决方案1】:

我猜来自npmimmutability-helper 包对你更新嵌套的redux 状态有很大帮助

import update from 'immutability-helper';

.......

case actions.UPDATE:
  return update(state, {
         arrObj: {
             [action.payload.index]: {
                 isSearch: {
                      $set: action.payload.isSearch
                 }
             }
          }
       })

【讨论】:

    【解决方案2】:

    如果您希望在您的状态中更新单个值,请尝试以下操作:

    case actions.UPDATE:
      var newState = { ...state }
      var arrayObj = newState.arrayObj = state.arrayObj.slice()
      var element = arrayObj[action.payload.index] = { ...arrayObj[action.payload.index] }
      element.isSearch = action.payload.isSearch
      return newState
    

    【讨论】:

    • 我修复了浏览器挂起问题。但是状态似乎没有改变。返回 newstate 时元素没有被分配给任何东西。
    • action.payload.index 是否已经存在对象?如果没有,我需要更改上面的代码。
    • 已经有一个对象。这有效 - const newState = { ...state }; if (action.payload.index) { newState.arrObj[action.payload.index].isSearch = action.payload.isSearch; } return newState;
    猜你喜欢
    • 2018-06-03
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2018-02-15
    • 2019-10-10
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多