【问题标题】:How can you replace entire state in Redux Toolkit reducer?如何替换 Redux Toolkit reducer 中的整个状态?
【发布时间】:2020-01-31 11:17:10
【问题描述】:

编辑:解决方案是在我完全替换它后返回state (return state = {...action.payload})!但为什么?单独替换字段时不需要返回它。

我正在使用Redux Toolkit,它简化了一些 Redux 样板。他们做的一件事是使用 Immer 允许您直接“修改”状态(事实上,您不是)。它工作正常,除了我不知道如何完全替换我的状态部分。例如,我想做这样的事情

const reducer = createReducer({ s: '', blip: [] }, {

    [postsBogus.type]: (state, action) => {
        state = { ...action.payload };
    }

state 保持不变。相反,我必须这样做

[postsBogus.type]: (state, action) => {
    state.s = action.payload.s;
    state.blip = action.payload.blip;
}

有没有办法可以完全替换状态?

【问题讨论】:

    标签: reactjs redux react-redux immer.js


    【解决方案1】:

    是的,正如您所说,您必须返回一个新值才能完全替换状态。

    即使在“普通”Redux reducer 中,分配 state = newValue 也无济于事,因为所做的只是说明名为 state局部函数变量 现在指向内存中的不同值.这对返回一个新值没有任何作用。

    专门针对 Immer,you can either mutate the contents of the Proxy-wrapped state value as long as it's an object or array, or you can return an entirely new value, but not both at once

    【讨论】:

    • 我也遇到了这个麻烦。即使在阅读了 Immer 的文档之后,我仍然认为从 slice reducer 执行 state = getInitialState() 是安全的,因为它“感觉”就像我正在返回(或者 slice 将隐式返回)一个新的 state 值而不做任何突变它(因为突变是在新的状态值内隐式完成的)。我认为这在文档中可能会更清楚。在常规的 Redux 中,我总是在每个 switch-case 上使用 return,所以这不是问题(即使我使用的是 Immer 的 produce)。
    • 此链接现已失效,我在 immer 文档中看不到任何可以替换它的内容。是否不再有支持的方式来执行此操作?
    • Immer 似乎已经更新了他们的文档结构,从 URL 中删除了 /docs/ 部分,作为切换到 Docusaurus v2 的一部分,这破坏了他们的外部链接。刚刚用正确的 URL 替换了这篇文章中的 Immer 文档链接。
    • 也遇到了这个问题;这个帮助的解决方案是return {...action.payload}
    • @MaximP,您不需要解构,根据文档,只需 return action.payload 就足够了。
    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 2021-02-11
    • 1970-01-01
    • 2020-11-10
    • 2020-05-23
    • 1970-01-01
    • 2017-02-23
    • 2023-03-22
    相关资源
    最近更新 更多