redux thunk 中的 getState() 是否改变了实际状态
Does getState() from redux thunk changes the actual state
我正在使用 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() 是否更改商店?
要回答您的确切问题,getState()
本身不会更改商店。
我想你想问的是 getState()
确实给了你对另一家商店的引用,所以修改 结果 getState()
会改变原来的值。
[getState()
] Returns: The current state tree of your application.
看起来您正在将状态数组传递到 filterInPlace
,然后将项目添加到它的末尾。
如果您不想改变状态树,可以查看以下模式:https://redux.js.org/recipes/structuring-reducers/immutable-update-patterns
getState()
不会更改商店,但会 return 引用商店。这意味着当您说 let currentState = getState().home.lists
时,currentState
现在指向您的商店。如果您修改它,它将改变您的商店。
显然这不是你想要的,所以你需要复制一份。
假设 lists
是一个数组,这就可以了。
let currentState = [...getState().home.lists]
我正在使用 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() 是否更改商店?
要回答您的确切问题,getState()
本身不会更改商店。
我想你想问的是 getState()
确实给了你对另一家商店的引用,所以修改 结果 getState()
会改变原来的值。
[
getState()
] Returns: The current state tree of your application.
看起来您正在将状态数组传递到 filterInPlace
,然后将项目添加到它的末尾。
如果您不想改变状态树,可以查看以下模式:https://redux.js.org/recipes/structuring-reducers/immutable-update-patterns
getState()
不会更改商店,但会 return 引用商店。这意味着当您说 let currentState = getState().home.lists
时,currentState
现在指向您的商店。如果您修改它,它将改变您的商店。
显然这不是你想要的,所以你需要复制一份。
假设 lists
是一个数组,这就可以了。
let currentState = [...getState().home.lists]