【问题标题】:Cloning an object within a redux reducer在 redux reducer 中克隆对象
【发布时间】:2020-04-01 02:59:22
【问题描述】:

我最近学习了 React 和 Redux,就在我以为我掌握了它的窍门时,我就被挂断了。

在我的减速器中,我的印象是扩展运算符应该在不同的内存位置创建对象的新实例。但是,使用 === 比较对象返回 true,我认为这意味着对象是相同的实例。

const initState = {

    loadcases: {
        1: {
            isActive: false,
            profile: 'UB'
        },
        2: {
            isActive: true,
            profile: 'PFC'
        }
    }
}


const designInput = (state=initState, action={}) => {

    let newState = {...state}; //clone design input state
    console.log(newState.loadcases === state.loadcases)
    // Prints: TRUE ---- WHYYYYYYY????????????

    // goes on to modify newState before returning it. 
}

redux 记录器显示我以前的状态已经等于新状态,这让我认为这里直接干扰了存储。我已经阅读了一些 redux 文档和其他帖子,这些帖子让我相信我已经正确设置了其他所有内容。

我们也非常感谢任何能就这个问题向我提供更多教育的资源。

更新:

Jayce's answer 正是发生的事情。

SO post 概述了适合深度克隆的方法。对我来说,我可能想要存储日期和其他数据,所以我选择使用lodash cloneDeep method

所以现在:console.log(cloneDeep(state) === state.loadcases); // false

【问题讨论】:

标签: reactjs redux


【解决方案1】:

您对扩展运算符创建新对象的假设是正确的,但是它不会对对象进行 deep 克隆。它将嵌套值的 references 复制到新对象,这就是打印它们相等的原因。

如果你想用嵌套值深度克隆一些你不能使用传播的东西,你必须使用另一种方法。您可以使用 lodash 之类的库,或者 JSON.parse(JSON.stringify(obj)) 之类的库,有多种选择,例如“Javascript 深度克隆对象”之类的 google

【讨论】:

  • 我几乎可以肯定这将是我的问题,因为我的状态比我展示的更深。我回家后会测试一下。谢谢!
  • @Steve 记住这也适用于传播数组,所以如果它是一个原始值数组(如字符串),那么新数组的值将完全分开,但如果你传播一个对象数组,那么新的数组将具有与原始对象相同的所有对象引用,更改一个将更改另一个
  • 谢谢杰斯,这解决了!我确实记得简要介绍过它,但我希望我能理解它稍后会引起的痛苦!
猜你喜欢
  • 2014-03-07
  • 2011-02-04
  • 2010-09-18
  • 2020-11-04
  • 2011-07-18
  • 2011-06-30
  • 1970-01-01
相关资源
最近更新 更多