我知道我不应该改变输入,而应该克隆对象来改变它。我遵循在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() })
但这改变了输入状态对象-即使我要返回一个新对象,也禁止这样做吗?
不,永远不要改变你的状态。
即使您要返回一个新对象,您仍然会污染旧对象,而您从来不希望这样做。这使得在旧状态与新状态之间进行比较时会出现问题。例如shouldComponentUpdate,react- redux在引擎盖下使用。这也使时间旅行成为不可能(即撤消和重做)。
shouldComponentUpdate
而是使用不可变方法。永远使用Array#slice,永不Array#splice。
Array#slice
Array#splice
我从您的代码中假定这action.payload是要删除的项目的索引。更好的方法如下:
action.payload
items: [ ...state.items.slice(0, action.payload), ...state.items.slice(action.payload + 1) ],