【问题标题】:Multiple updates to an array in a redux reducer在 redux reducer 中对数组进行多次更新
【发布时间】:2016-08-16 18:53:56
【问题描述】:

我正在 Redux 商店上创建一个新操作。 我有一个项目列表,它们都具有“overlayVis”的属性。除了指定的 ID,我想将所有这些设置为 true。我目前的实现是

case ITEM_OVERLAY_TOGGLE:
  // object to be updated and returned   
  var returnObj = state.data;

  state.data.map((item) => {
    if (item.id === action.id) {
      returnObj = Object.assign({}, ...state, {
        data: [
          ...state.data.slice(0, item.id),
          Object.assign({}, ...state.data[item.id], {overlayVis: false}),
          ...state.data.slice(item.id + 1)]
      });
    } else if (!item.overlayVis) {
      returnObj = Object.assign({}, ...state, {
        data: [
          ...state.data.slice(0, item.id),
          Object.assign({}, ...state.data[item.id], {overlayVis: true}),
          ...state.data.slice(item.id + 1)]
      });
    }
  });

  return returnObj;

每次迭代都会覆盖上一次迭代,因此每次运行操作时只进行一次更改。我试图使用“state”和“returnObj”而不是“...state”,但它没有奏效。好久没在这里发帖了,没啥想法。

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript action state redux


    【解决方案1】:

    我认为您的地图功能可以更改为如下所示。我只能从这里猜测,但你能看看这是否有效吗?

    Map 函数用于转换数组中的对象,您需要在 map 函数中返回一个值才能进行转换。转换后的值存储在一个名为 newData 的新数组中。那是在外面返回的。

    case ITEM_OVERLAY_TOGGLE:
        var newData = state.data.map((item) => {
        if (item.id === action.id) {
          return  {
                ...item,
                overlayVis:false
            }
        } else {
            return {
                  ...item,
                  overlayVis : true
            }
        }
      });
    
     return {
        ...state,
        data: newData
      }
    

    编辑:如果action.id也是数组的索引,试试这个

    case ITEM_OVERLAY_TOGGLE:
      // object to be updated and returned   
    
      return {
         ...state,
         data : [
             ...state.data.slice(0,action.id).map(i=>{ i.overlayVis = true, return i;  }),
             state.data[action.id].overlayVis=false,
             ...state.data.slice(action.id+1).map(i=>{ i.overlayVis = true, return i;  })
         ]
      };
    

    【讨论】:

    • 我想我刚刚经历了一个灵光乍现的时刻......事情似乎更清晰了!谢谢,似乎工作得很好。
    • 但是等等...这将重新从头开始重新创建所有项目?
    • 是的,确实如此。但是如果你不这样做,你的 React 组件持有的引用将保持不变,这意味着组件认为没有任何改变。更改每个突变的引用非常重要。
    • 此外,展开运算符很浅,这意味着嵌套在对象中的复杂对象不会重新创建。 es6fiddle.net/inciq40i
    • Action.Id 是索引,所以我们回到了我在 OP 中开始的地方
    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2019-05-07
    • 2022-01-05
    • 2018-09-06
    • 2017-07-12
    相关资源
    最近更新 更多