不可变状态更新。在 Redux 中更新对象数组

Posted

技术标签:

【中文标题】不可变状态更新。在 Redux 中更新对象数组【英文标题】:Immutable state update. Update an array of objects in Redux 【发布时间】:2019-11-12 04:04:41 【问题描述】:

我有一个数组类型的状态,最初看起来像这样:

const initialState = 
    spots: []

在第一次更新时,它会被对象填充,看起来像这样:

state.spots = [
     id: '1', available: 1, path: 'xxx' ,
     id: '2', available: 1, path: 'xxz' ,
     id: '3', available: 1, path: 'xxy' ,
     id: '4', available: 1, path: 'bxy' ,
     id: '5', available: 1, path: 'vxy' ,
     id: '6', available: 1, path: 'fxy' 
]

在所有后续更新中,我们得到了所有带有“id”和“available”键的位置,但没有路径。

所以载荷看起来像这样:

payload = [
     id: '1', available: 1 ,
     id: '2', available: 0 ,
     id: '3', available: 0 ,
     id: '4', available: 1 ,
     id: '5', available: 0 ,
     id: '6', available: 1 
]

我正在尝试找出不可变的 ES6 模式来更新状态,但我似乎无法做到正确。

编辑: 到目前为止我发现的最佳解决方案如下:

state.spots = state.spots.map( (spot, key) =>     
  let new_spot = payload.find(o => o.id === spot.id);
  return  ...spot, ...new_spot 
)

使用新有效负载正确更新数组“点”的所有对象的最有效方法是什么。

希望很清楚。 谢谢

【问题讨论】:

如果有效负载和状态是以 id 作为键,其余作为值的对象,似乎会更容易。这是一个选择吗? 【参考方案1】:

CodeSandbox


您可以使用每个点的 id 作为键创建有效负载的哈希映射:

const payload = [
     id: '1', available: 1 ,
     id: '2', available: 0 ,
     id: '3', available: 0 ,
     id: '4', available: 1 ,
     id: '5', available: 0 ,
     id: '6', available: 1 
]

// You can adjust the map to how you like.

const map = payload.reduce((acc, entry) => 
    acc[entry.id] = entry
    return acc
, )

然后在你的 reducer 中更新 state.spots

return 
    ...state,

    spots: state.spots.map(e => 
        if (map[e.id]) return  ...e, ...map[e.id] ;
        return e;
    )
;

【讨论】:

以上是关于不可变状态更新。在 Redux 中更新对象数组的主要内容,如果未能解决你的问题,请参考以下文章

我想以不可变的方式更新状态对象,以便react和redux正常工作?

Redux - 通过其键在状态数组中查找对象并更新其另一个键

在 Redux 状态下更新单个值

在 Redux 中更新递归对象状态

Redux:使用 Redux 更新数组的状态

javascript 更新状态React Redux不可变