【问题标题】:Setting set in object nested 3 level deep设置在对象嵌套 3 级深
【发布时间】:2019-02-12 15:12:48
【问题描述】:

大家好,我有一个问题,从一开始我会提到我已经尝试过this和this

我的情况如下。我有 API,它发送给我

Root 处于组件状态!

Root: {
  RootVal1: {
    Prop1: '',
    Prop2: '',
    Prop3: '',
  }
  RootVal2: [
    PropObj1: {
      NestedProp1: '',
      NestesPropObj: {
        NestedEvenMoreProp1: '',
        NestedEvenMoreProp2: '',
        NestedEvenMoreProp3: ''
      }
    },
    PropObj2: {
      NestedProp1: '',
      NestesPropObj: {
        NestedEvenMoreProp1: '',
        NestedEvenMoreProp2: '',
        NestedEvenMoreProp3: ''
      }
    },
    PropObj3: {
      NestedProp1: '',
      NestesPropObj: {
        NestedEvenMoreProp1: '',
        NestedEvenMoreProp2: '',
        NestedEvenMoreProp3: ''
      }
    },
  ]
}

如何使用setState 更新Prop1、Prop2、Prop3、NestedEvenMoreProp1、NestedEvenMoreProp2、NestedEvenMoreProp3? 最后一个限制是我无法更改 root 的名称(我无法将其重命名为 newRoot 等)

我尝试的是调用这个函数:

  /**
   * @summary update state using immutable object
   * @param {Object} name of key and value for update
   * @returns {string} Promise that returns
   */
  updateStateHelper = target => new Promise((resolve) => {
    const updatedState =
      update(this.state[target.name], { $merge: { [target.name]: target.value } });
    this.setState(prevState => ({
      ...prevState,
      updatedState,
    }), () => resolve(this.state[target.name]));
  });

这样:

// data[0] and data[1] is just copy of RootVal2 and RootVal1, with changed values. 
data[0]
data[1]

const root = Object.assign({}, this.state.root);
root.RootVal2 = [...data[0].RootVal2];
root.RootVal1 =  {...data[1]};
//Here root displays edited 
console.log(root);

this.updateStateHelper({name: 'root', value: root,})
  .then(() => {
    //Here root displays without the edit
    console.log(this.state.root);
    resolve('Success');
  });

【问题讨论】:

  • 请显示您尝试过的内容的 sn-p。您提到的第二个链接应该已经回答了您的问题,所以我猜您遗漏了一些东西
  • @TelmoDias OP 在他的问题中给出了完全相同的链接
  • @Logar 我编辑了帖子,并举了我试过的例子。
  • @Trefl 抱歉,但我现在没有时间玩它,这里有一个如何更新你的状态的快速示例,希望它对你来说足够了:repl.it/repls/CourteousAngelicOctagon

标签: javascript reactjs


【解决方案1】:

您可以使用Spead Operator。

示例(更新Prop1、Prop2 和Prop3):

this.setState({
  Root:
    ...this.state.Root, 
    RootVal1: {
      ...this.state.Root.RootVal1,
      Prop1: "Prop1 value here",
      Prop2: "Prop2 value here",
      Prop3: "Prop3 value here"
    }
  }
);

更多信息here(感谢@TelmosDias)

【讨论】:

  • 对不起,我忘了提 root 必须具有相同的名称,更新后。所以我不能把它重命名为 newRoot。
  • 伙计,阅读 OP 的问题。虽然您的样本是正确的,但您提供的链接已经存在问题中,并且 OP 说他尝试过,所以他在某处遗漏了一些东西,但您并没有帮助他
  • 您不必重命名,只需覆盖您的 Root 对象即可。 @Logar是的,他已经在他的问题中链接了这个anwser,但他没有应用这样的东西(或者他没有提到他做过,或者我错过了一些东西)
  • @Darkilen 好吧,基本上你只是复制粘贴了带有修改数据的 SO 链接,这在某些情况下可能很好,即使最好将其标记为欺骗。但如果另一个答案对他没有帮助,我看不出这个答案会如何
猜你喜欢
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多