Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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
Reactjs 在React中设置状态之前编辑此。状态内容_Reactjs - Fatal编程技术网

Reactjs 在React中设置状态之前编辑此。状态内容

Reactjs 在React中设置状态之前编辑此。状态内容,reactjs,Reactjs,我想知道这种代码是否会产生副作用 假设我在一个组件中有一个状态对象,该组件包含一个数组,该数组本身包含具有各种属性的对象: getInitialState: function () { return { willContainObjects: []; } 现在,我有一个函数,它将编辑该对象,然后创建一个新的状态对象: editObjectInArray: function (index) { var obj= this.state.willCon

我想知道这种代码是否会产生副作用

假设我在一个组件中有一个状态对象,该组件包含一个数组,该数组本身包含具有各种属性的对象:

getInitialState: function () {
        return {
            willContainObjects: [];
}
现在,我有一个函数,它将编辑该对象,然后创建一个新的状态对象:

editObjectInArray: function (index) {
    var obj= this.state.willContainObjects[index];
    obj.someProp = 3; // mutating this.state!!!
    this.setState({
    willContainObjects: this.state.willContainObjects.slice(0, index)
                       .concat(details)
                       .concat(this.state.willContainObjects.slice(index+1))
    }); // end setState
},
obj.someProp=3
直接变异了
this.state
的状态,但就在调用
this.setState
并导致重新渲染之前。在调用
setState
之前,这种状态的直接突变是否会产生任何意外的副作用?我知道React建议不要这样做,但我认为这是一个例外。我可以使用
Object.assign
来创建一个新对象,而不是进行变异,但在这种情况下,我看不出这样做有什么意义。

唯一的“副作用”任何使用PureRenderMixin或实现使用浅层相等测试的
shouldComponentUpdate
方法的组件都可能无法理解对象确实发生了更改


除此之外,虽然不推荐,但它应该可以正常工作。

@zerkms这不是真的。React不假定处于
状态的对象是不可变的。您必须通过实现
组件shoulldupdate
来选择该假设。OP并没有改变
这个.state
。OP正在变异
此.state
的子对象。默认情况下,只要您最终调用
this.setState()
this.forceUpdate()
@zerkms,React就会尊重这种突变?请特别注意“注释”部分,特别是关于您所在州的可变对象的内容。@Brandon现在这是一个答案。