我知道我不应该改变输入,而应该克隆对象来改变它。我遵循 redux 启动项目中使用的约定,该项目使用:
ADD_ITEM: (state, action) => ({
...state,
items: [...state.items, action.payload.value],
lastUpdated: action.payload.date
})
用于添加项目 - 我使用 spread 将项目附加到数组中。
为了删除我使用:
DELETE_ITEM: (state, action) => ({
...state,
items: [...state.items.splice(0, action.payload), ...state.items.splice(1)],
lastUpdated: Date.now()
})
但这正在改变输入状态对象 - 即使我返回一个新对象,这是否被禁止?
不,永远不要改变你的状态。
即使您返回一个新对象,您仍然会污染旧对象,这是您永远不想做的。这使得在旧状态和新状态之间进行比较时出现问题。例如在shouldComponentUpdate
其中react-redux在幕后使用。它还使得时间旅行变得不可能(即撤消和重做)。
相反,使用不可变的方法。总是使用Array#slice
永不Array#splice
.
我从你的代码中假设action.payload
是要删除的项目的索引。更好的方法如下:
items: [
...state.items.slice(0, action.payload),
...state.items.slice(action.payload + 1)
],
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)