redux thunk中的getState()是否会改变实际状态

4

我正在使用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()方法会返回当前的状态,但不会修改store。

2个回答

6

getState() 不会改变 store,但它会返回一个指向 store 的引用。也就是说,当你说 let currentState = getState().home.lists 时,currentState 现在指向了你的 store。如果你修改它,它会改变你的 store。

显然这不是你想要的,所以你需要复制一份。

假设 lists 是一个数组,这样做可以解决问题:

let currentState = [...getState().home.lists]


2
回答你的确切问题,getState()本身不会改变存储。

我认为你想问的是,以及你感到困惑的是,getState()确实会给你另一个存储的引用,因此修改getState()的结果将更改原始值。

通过Redux文档

[getState()] 返回:应用程序的当前状态树。

看起来你正在将你的state数组传递到filterInPlace中,然后在其末尾添加项目。
如果您不想改变状态树,请查看一些模式:https://redux.js.org/recipes/structuring-reducers/immutable-update-patterns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接