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

时间:2019-03-15 18:15:05

标签: reactjs redux react-redux redux-thunk

我正在使用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()是否更改商店?

2 个答案:

答案 0 :(得分:2)

getState()不会更改商店,但会返回对商店的引用。意思是当您说let currentState = getState().home.lists时,currentState现在指向您的商店。如果您对其进行修改,它将更改您的商店。

显然这不是您想要的,所以您需要进行复制。

假设lists是一个数组,就可以解决问题。

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

答案 1 :(得分:1)

要回答您的确切问题,fopen(filename, "rb")本身不会更改商店。

我认为您想问的是什么,以及您感到困惑的是,getState()确实为您提供了对另一家商店的引用,因此修改了 { {1}}将更改原始值。

通过the redux docs

  

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

您似乎要将状态数组传递到getState()中,然后在其末尾添加项目。

如果您不想改变状态树,可以查看以下模式:https://redux.js.org/recipes/structuring-reducers/immutable-update-patterns