Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我们需要在Redux reducer中更新之前传播状态?_Javascript_Ecmascript 6_Redux - Fatal编程技术网

Javascript 为什么我们需要在Redux reducer中更新之前传播状态?

Javascript 为什么我们需要在Redux reducer中更新之前传播状态?,javascript,ecmascript-6,redux,Javascript,Ecmascript 6,Redux,对专业人士来说,这只是一个简单的问题。我正在构建一个减速机,一段代码如下所示: export const cusDataReducer = (state = cusDataInitialState, action) => { let newState = {...state} switch (action.type) { case "CUS_READ": newState.data = action.value;

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

export const cusDataReducer = (state = cusDataInitialState, action) => {    
    let newState = {...state}
    switch (action.type) {
        case "CUS_READ":
            newState.data = action.value;
            newState.loading = false;                        
            break;
...
我的问题是,在这种情况下,国家和{……国家}之间有什么区别?如果我更改newState=state,代码将中断。然而,state和{…state}的控制台日志看起来完全相同

这是我的商店:

import {cusDataReducer} from './cusdata'

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

这不会创建新对象:

let newState = state;
let newState = {...state};
变量newState只指向与state相同的对象。修改该对象会改变当前状态,这是错误的

但是,这会创建一个新对象:

let newState = state;
let newState = {...state};
扩展运算符。。。基本上是用现有对象的每个属性填充新对象的一种非常方便的缩写。较长的版本可能类似于:

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

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

这不会创建新对象:

let newState = state;
let newState = {...state};
变量newState只指向与state相同的对象。修改该对象会改变当前状态,这是错误的

但是,这会创建一个新对象:

let newState = state;
let newState = {...state};
扩展运算符。。。基本上是用现有对象的每个属性填充新对象的一种非常方便的缩写。较长的版本可能类似于:

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

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

很有意义。谢谢那么,如果我添加另一个名为emldata的reducer,那么如何知道要在存储中更新哪个reducer键呢?@Elcid_91:我不知道你的意思。reducer的主要结构是一个开关,它决定调用哪种操作类型。这些都应该是相互排斥的。一旦进入正确的情况,那么代码就是专门编写的,以执行对状态的必要更新。无论您需要为该操作更新哪些字段,您都会对其进行更新。好的,我会再试一次,我问,因为我在存储中有两个结构相同的减缩器。在存储中加载了一个密钥,但另一个密钥加载了相同的数据…非常奇怪。如果再次发生这种情况,我将清理muy代码并在另一个问题中发布..谢谢!这很有道理。谢谢那么,如果我添加另一个名为emldata的reducer,那么如何知道要在存储中更新哪个reducer键呢?@Elcid_91:我不知道你的意思。reducer的主要结构是一个开关,它决定调用哪种操作类型。这些都应该是相互排斥的。一旦进入正确的情况,那么代码就是专门编写的,以执行对状态的必要更新。无论您需要为该操作更新哪些字段,您都会对其进行更新。好的,我会再试一次,我问,因为我在存储中有两个结构相同的减缩器。在存储中加载了一个密钥,但另一个密钥加载了相同的数据…非常奇怪。如果再次发生这种情况,我将清理muy代码并在另一个问题中发布..谢谢!仅供参考:以下内容适用于React状态,相同的不变性原则适用于Redux还原器:仅供参考:以下内容适用于React状态,相同的不变性原则适用于Redux还原器: