【问题标题】:Why do we need to spread the state before updating it in a Redux reducer?为什么我们需要在 Redux reducer 中更新状态之前传播状态?
【发布时间】:2020-03-16 18:39:43
【问题描述】:

对于专业人士来说只是一个简单的问题。我正在构建一个reducer,一段代码如下所示:

export const cusDataReducer = (state = cusDataInitialState, action) => {    
    let newState = {...state}
    switch (action.type) {
        case "CUS_READ":
            newState.data = action.value;
            newState.loading = false;                        
            break;
...

我的问题是在这种情况下state{...state} 有什么区别?如果我更改newState=state,代码就会中断。但是,state{...state} 的控制台日志看起来完全一样。

这是我的商店:

import {cusDataReducer} from './cusdata'

let rootReducer = combineReducers({
    cusdata: cusDataReducer
});
export const Store = createStore(rootReducer,applyMiddleware(thunk))

【问题讨论】:

标签: javascript ecmascript-6 redux


【解决方案1】:

这不会创建新对象:

let newState = state;

变量newState 只是指向与state 相同的对象。修改该对象会改变当前状态,这很糟糕。

然而,这确实会创建一个新对象:

let newState = {...state};

扩展运算符 (...) 基本上是一种非常方便的简写,用于使用现有对象的每个属性填充新对象。更长的版本可能是这样的:

let newState = {
    prop1: state.prop1,
    prop2: state.prop2,
    //etc.
};

通过创建一个新对象,它不再是当前的实际状态。你可以随心所欲地改变你的新对象。返回后,Redux 会用整个新状态替换整个当前状态。

【讨论】:

  • 很有道理。谢谢!
  • 那么,如果我添加另一个名为“emldata”的reducer,如何知道要在商店中更新哪个reducer key?
  • @Elcid_91:我不确定你的意思。 reducer 的主要结构是switch,它决定了正在调用的动作类型。这些都应该是相互排斥的。一旦您进入正确的case,然后专门编写代码来执行必要的状态更新。无论您需要为该操作更新什么字段,您都会更新它们。
  • 好吧,我再试一次,我问是因为我在商店里有两个结构相同的减速器。在商店中加载了一个键,但另一个键加载了相同的数据....非常奇怪。如果再次发生,我将清理 muy 代码并发布另一个问题。谢谢!
猜你喜欢
  • 2020-02-04
  • 2023-01-28
  • 2019-07-28
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 2017-08-08
相关资源
最近更新 更多