在Redux中,是否有必要做深拷贝

IT技术 reactjs redux
2021-05-03 06:51:57

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

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

我应该如何在减速器中处理它?

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个回答

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

有关如何正确执行不可变更新的一些信息,请参阅 Redux 文档中关于不可变更新模式的部分,以及有关深度克隆的 Redux 常见问题条目

来自 Redux:

常见的 Redux 误解:您需要深度克隆状态。现实:如果里面的东西没有改变,保持它的引用不变!

不,Unchanged 属性的浅拷贝。
无论如何,更改的属性将是新值,因此不存在复制类型的问题。

在代码中我们是这样实现的return {...prevState}

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

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