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

Posted

技术标签:

【中文标题】redux thunk 中的 getState() 是不是会更改实际状态【英文标题】:Does getState() from redux thunk changes the actual stateredux thunk 中的 getState() 是否会更改实际状态 【发布时间】:2019-08-06 21:15:30 【问题描述】:

我正在使用 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() 会改变存储吗?

【问题讨论】:

【参考方案1】:

getState() 不会更改存储,但会返回对存储的引用。意思是当你说let currentState = getState().home.listscurrentState 现在指向你的商店。如果你修改它,它会改变你的商店。

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

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

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

【讨论】:

【参考方案2】:

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

我认为您想问的问题以及您感到困惑的是,getState() 确实为您提供了对另一家商店的引用,因此修改了getState()结果会改变原来的值。

通过the redux docs:

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

看起来您正在将状态数组传递给filterInPlace,然后将项目添加到它的末尾。

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

【讨论】:

以上是关于redux thunk 中的 getState() 是不是会更改实际状态的主要内容,如果未能解决你的问题,请参考以下文章

getState 和 dispatch 如何在 redux-thunk action creator 中导入?

redux-thunk源码分析

Redux getState 在行动中不起作用

使用带有 getState() 的 mockStore 进行 Thuk 测试

redux-thunk初步使用

为啥我们已经有了 mapDispatchToProps 还需要 redux-thunk