在Redux中,是否有必要进行深层复制

时间:2017-04-01 00:58:38

标签: reactjs redux

以下对象action.data有一个嵌套对象address

{
    name: 'Ben',
    address: {
        country: 'Australia',
        state: 'NSW'
    }
}

我应该如何在减速机中处理它?<​​/ p>

const rootReducer = (state = initState, action) {
    switch(action.type) {
        switch RECEIVE_DATA:
            return {...state, data: action.data}
    }
}

我可以像上面那样做吗?我只是将整个对象分配给data而不复制?

const rootReducer = (state = initState, action) {
    switch(action.type) {
        switch RECEIVE_DATA:
            const address = {...action.data.address}
            const data = {...action.data, address}
            return {...state, data}
    }
}

或者我应该对该对象进行深层复制并将其分配给data? 感谢

4 个答案:

答案 0 :(得分:17)

&#34;正确&#34;处理嵌套数据更新的方法是使用多个浅拷贝,每个嵌套级别一个。根据你的第一个例子,创建一个完全替换一个字段的新对象当然也可以。

请参阅Immutable Update Patterns上的Redux文档部分,了解有关如何正确执行不可变更新的一些信息,以及avoiding deep cloning上的Redux常见问题解答条目。

答案 1 :(得分:11)

来自Redux:

  

Common Redux误解:你需要深度克隆状态。现实:如果里面的东西没有改变,保持它的参考相同!

答案 2 :(得分:0)

不,浅表未更改的属性。
更改后的属性无论如何都是新值,因此复制类型没有问题。

在代码中,我们像这样return {...prevState}

答案 3 :(得分:0)

如果你只更改数组中的一项,Redux 文档说你可以使用 array.map,但如果你知道索引,这会更快:

     state[action.args.index] = {
        ...state[action.args.index],
        disregardLeafNode: action.args.checked
     }
     return state