【问题标题】:How to copy nested state between objects in React如何在 React 中的对象之间复制嵌套状态
【发布时间】:2016-02-09 14:01:29
【问题描述】:

在一个反应​​应用程序中,我的状态如下所示:

dates: {"2015-11-20":{
                      "13:00":{...},
                      "14:00":{...}},
        "2015-11-21":{
                      "18:00":{...},
                      "19:00":{...}}}

我在更新状态时遇到了问题 - 我的用例是我希望用户能够通过 UI 将所有时间(例如下午 1 点和下午 2 点)复制到其他日期并相应地更新状态。

到目前为止,我所有的尝试都导致了引用,其中单独的对象被链接起来,对一个对象的任何更新都会导致对另一个对象的更新。

产生损坏行为的示例代码:

copyTimes: function() {
      var keys = [];
      Object.keys(this.state.dates).map(function(key) {
          keys.push(key);
      });

      for(var i in keys) {
        this.state.dates[keys[i]] = this.state.dates[this.state.selectedDate];
      }

      this.setState({dates: this.state.dates});
  }

根据https://facebook.github.io/react/docs/update.html,我相信我可能需要使用 react add on 'update' 来解决这个问题

但我无法完全理解我需要采用的语法方法。如何导致正确更新“复制”一个日期的内容:“2015-11-20”到另一个日期,例如2015-11-21 在上面的例子中?

编辑 根据(在 cmets 中指出):What is the most efficient way to deep clone an object in JavaScript?

  copyTimes: function() {
      var keys = [];
      var tempStart =  JSON.parse(JSON.stringify(this.state.dates));
      Object.keys(this.state.dates).map(function(key) {
          keys.push(key);
      });

      for(var i in keys) {
        tempStart[keys[i]] = JSON.parse(JSON.stringify(this.state.dates[this.state.selectedDate]));
      }

      this.setState({dates: tempStart});
  },

上述方法有效 - 但非常难看。有更好的方法吗?

【问题讨论】:

  • 不确定是否与您的问题有关,但来自documentation 中的大红框“永远不要直接改变this.state,因为之后调用setState() 可能会替换您所做的突变。将this.state 视为不可变。”。我想你需要的是深度克隆this.state.dates[this.state.selectedDate]。见stackoverflow.com/q/122102/218196

标签: javascript reactjs state


【解决方案1】:

copyTimes: function() {
      var keys = [];
      Object.keys(this.state.dates).map(function(key) {
          keys.push(key);
      });

      var newDates = Object.assign({}, this.state.dates);;
      for(var i in keys) {
        newDates[keys[i]] = this.state.dates[this.state.selectedDate];
      }

      this.setState({dates: newDates});
  }

【讨论】:

  • 不幸的是,这会导致同样的问题。深度克隆是必要的。
  • 您能解释一下您所做的更改以及为什么它会解决问题吗? (它没有,所以我很好奇你的思维过程)
  • 是否 var newDates = Object.assign({}, this.state.dates);工作。
  • 它导致引用,其中单独的对象被链接并且对一个对象的任何更新都会导致对另一个对象的更新。这就是我的问题试图解决的问题。
  • Object.assign 是一种克隆方法,所以不应该有链接。
猜你喜欢
  • 2020-07-31
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多