我正在使用getState()检索状态的一部分,以从事件处理程序中的状态中过滤一些值(在分派动作并使用新的状态切片更新存储之前),但是更改getState的结果似乎是更改实际的商店。
请考虑以下内容:
const filterInPlace = (array, predicate) => {
let end = 0;
for (let i = 0; i < array.length; i++) {
const obj = array[i]
if (predicate(obj)) {
array[end++] = obj
}
}
array.length = end
}
//some event handler
...
const forDeletion = new Set([...ids])
let currentState = getState().home.lists
filterInPlace(currentState, obj => !forDeletion.has(obj.rowid))
dispatch(handleSelectLists(ids)) //Leads to an action and reducer
getState()是否更改商店?
答案 0 :(得分:2)
getState()
不会更改商店,但会返回对商店的引用。意思是当您说let currentState = getState().home.lists
时,currentState
现在指向您的商店。如果您对其进行修改,它将更改您的商店。
显然这不是您想要的,所以您需要进行复制。
假设lists
是一个数组,就可以解决问题。
let currentState = [...getState().home.lists]
答案 1 :(得分:1)
要回答您的确切问题,fopen(filename, "rb")
本身不会更改商店。
我认为您想问的是什么,以及您感到困惑的是,getState()
确实为您提供了对另一家商店的引用,因此修改了 { {1}}将更改原始值。
[{
getState()
] 返回:您应用程序的当前状态树。
您似乎要将状态数组传递到getState()
中,然后在其末尾添加项目。
如果您不想改变状态树,可以查看以下模式:https://redux.js.org/recipes/structuring-reducers/immutable-update-patterns