小编典典

这是使用Redux删除项目的正确方法吗?

reactjs

我知道我不应该改变输入,而应该克隆对象来改变它。我遵循在redux入门项目上使用的约定,该约定使用:

ADD_ITEM: (state, action) => ({
  ...state,
  items: [...state.items, action.payload.value],
  lastUpdated: action.payload.date
})

用于添加项目-我使用了点差将项目追加到数组中。

用于删除我使用的:

DELETE_ITEM: (state, action) => ({
  ...state,
  items: [...state.items.splice(0, action.payload), ...state.items.splice(1)],
  lastUpdated: Date.now() 
})

但这改变了输入状态对象-即使我要返回一个新对象,也禁止这样做吗?


阅读 253

收藏
2020-07-22

共1个答案

小编典典

不,永远不要改变你的状态。

即使您要返回一个新对象,您仍然会污染旧对象,而您从来不希望这样做。这使得在旧状态与新状态之间进行比较时会出现问题。例如shouldComponentUpdate,react-
redux在引擎盖下使用。这也使时间旅行成为不可能(即撤消和重做)。

而是使用不可变方法。永远使用Array#slice,永不Array#splice

我从您的代码中假定这action.payload是要删除的项目的索引。更好的方法如下:

items: [
    ...state.items.slice(0, action.payload),
    ...state.items.slice(action.payload + 1)
],
2020-07-22