为什么我的反应状态变得不可变?

时间:2018-01-30 13:36:49

标签: javascript reactjs state

我记得以前我无法手动更新反应状态。 现在,我不知道为什么,我能做到。

我的情况: enter image description here

并在此更改属性!它有效!为什么呢?

enter image description here

P.s:我使用react16.02

3 个答案:

答案 0 :(得分:2)

在javascript对象中是可变的。

例如,如果

var a = {"something": 1}

如果您将其分配给另一个变量b并且如果更改其值,则对象a的值也会更改

var b = a;
b.something = 2;
console.log(b);
console.log(a);

//output {"something": 2}

两者都会打印{“某事”:2}。 a中的值也会改变。

同样在您的代码中,您直接在行号61中分配状态值,并在行号62中对其进行变更。

更好的方法是使用

let newOptions = {...this.state.newOptions };

let newOptions = Object.assign({},this.state.newOptions}

这将创建新对象。

答案 1 :(得分:2)

React状态是可变的,因此您可以直接更新反应状态。但是由于多种原因,建议不要改变反应状态。其中一个原因是,如果您执行this.state.count = 3,则反应DOM将以不可预测的方式运行,例如覆盖数据而不是重新呈现。性能调优是另一个原因。

对调用setState()的反应将在不久的将来调用render方法,这将导致使用新值更新DOM。

答案 2 :(得分:2)

国家确实在做出反应。你应该非常小心,不要像那样覆盖它,否则你会遇到意想不到的结果。最好将状态复制到另一个对象,然后根据需要更改其属性,并在完成后使用set state设置将对象状态设置为复制对象。 您可以使用Object.Assign或spread运算符。使用数组时,扩展运算符更容易。

this.state = {
  myObj : {propA: "A" , propB: "B"};
}

然后在某些时候你想改变它

let myObj = this.state.myObj;
let copyMyObj = {...myObj};
copyMyObj.propA = "C";
this.setState({
myObj: copyMyObj
});