Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Reactjs:在修改对象之前,是否需要复制处于组件状态的对象?_Javascript_Reactjs - Fatal编程技术网

Javascript Reactjs:在修改对象之前,是否需要复制处于组件状态的对象?

Javascript Reactjs:在修改对象之前,是否需要复制处于组件状态的对象?,javascript,reactjs,Javascript,Reactjs,假设my reactjs组件有两种状态: a: { a: 1 }, b: [1, 2, 3] 现在我希望他们成为: a: { a: 1, b: true }, b: [1, 2, 3, 4] 这样做是否正确: this.state.a.b = true; b = this.state.b.push(4); this.setState({ a: this.state.a, b: b }); 如果没有,正确的方法是什么。状态属性应该被替换,而不是变异:

假设my reactjs组件有两种状态:

a: {
    a: 1
},
b: [1, 2, 3]
现在我希望他们成为:

a: {
    a: 1,
    b: true
},
b: [1, 2, 3, 4]
这样做是否正确:

this.state.a.b = true;
b = this.state.b.push(4);
this.setState({
    a: this.state.a,
    b: b
});

如果没有,正确的方法是什么。

状态属性应该被替换,而不是变异:

this.setState({
    a: { // create new a object
        a: this.state.a.a,
        b: true
    },
    b: this.state.b.concat([4]) // create new b array
});
  this.setState({
    a: Object.assign({}, this.state.a, { b: true }),
    b: [...this.state.b, 4]
  });
最好的方法

  this.setState({
    a: Object.assign({}, this.state.a, { b: true }),
    b: [...this.state.b, 4]
  });
直截了当地说:

不要直接修改状态

例如,这不会重新渲染组件:

// Wrong
this.state.comment = 'Hello';
相反,请使用setState():


因此,如果使用setState,则无需在修改对象之前复制它

因此您的代码可能如下所示:

this.setState({
    a: (this.state.a.b = true),
    b: this.state.b.push(4)
})