如果我使用参数相同的参考对象操作 setState,为什么要重新渲染..?
If i operate setState with parameter same reference object, why this re-render..?
我知道如果状态改变,这个组件会重新渲染。
但是当我将相同的对象插入到 setState 的参数中时。该组件正在重新渲染。
像这样
obj1 = {
do: true
};
obj2 = {
do: true
};
obj3 = this.obj1;
constructor(props) {
super(props);
//init state
this.state = {
do: true
};
this.changeProps = this.changeProps.bind(this);
}
changeProps = function() {
this.setState(this.obj3);
};
此处link
https://codesandbox.io/s/xenodochial-engelbart-33dl7
我能得到一些建议吗..?
谢谢。
每次打开和关闭括号来定义一个对象时,您都在定义一个不同的对象,无论它具有什么属性。
这就是为什么:
this.obj1 = {
do: true
};
this.obj2 = {
do: true
};
console.log(this.obj1 === this.obj2); // false
这里在内存中创建了两个对象,并且对每个对象的引用分别作为值分配给 this.obj1 和 this.obj2。
当您执行 this.obj3 = this.obj1;
时,obj3 的值将是对内存中已存在对象的引用。这两个对象将指向同一个对象,因此
console.log(this.obj1 === this.obj3); //true
.
实际上当你这样做时 this.setState React 会看到这个对象中的属性,React 将使用它来执行浅合并,所以这里
this.setState(this.obj3);
就像
this.setState({ do: true });
因为这就是这个对象所拥有的。所以这些属性 React 会更新。
并且您只能在 构造函数 中使用 this.state 更改初始状态,您不会在 React
中改变状态
希望对您有所帮助
我假设你的问题是为什么当对象不一定改变时反应渲染。
调用setState时,react会触发对render函数的调用。此 'call' 渲染函数可能会或可能不会导致 'commit' 到 DOM。
它导致 'commit' 到 DOM,仅当渲染 'call' 创建的虚拟 DOM 与当前实际 [=25] 存在差异时=].
为了您的优化需求:重新渲染不是问题,而实际提交到 DOM 的重新渲染可能是问题。
我建议你完成这个 from kent c dodds
我知道如果状态改变,这个组件会重新渲染。 但是当我将相同的对象插入到 setState 的参数中时。该组件正在重新渲染。 像这样
obj1 = {
do: true
};
obj2 = {
do: true
};
obj3 = this.obj1;
constructor(props) {
super(props);
//init state
this.state = {
do: true
};
this.changeProps = this.changeProps.bind(this);
}
changeProps = function() {
this.setState(this.obj3);
};
此处link https://codesandbox.io/s/xenodochial-engelbart-33dl7
我能得到一些建议吗..? 谢谢。
每次打开和关闭括号来定义一个对象时,您都在定义一个不同的对象,无论它具有什么属性。
这就是为什么:
this.obj1 = {
do: true
};
this.obj2 = {
do: true
};
console.log(this.obj1 === this.obj2); // false
这里在内存中创建了两个对象,并且对每个对象的引用分别作为值分配给 this.obj1 和 this.obj2。
当您执行 this.obj3 = this.obj1;
时,obj3 的值将是对内存中已存在对象的引用。这两个对象将指向同一个对象,因此
console.log(this.obj1 === this.obj3); //true
.
实际上当你这样做时 this.setState React 会看到这个对象中的属性,React 将使用它来执行浅合并,所以这里
this.setState(this.obj3);
就像
this.setState({ do: true });
因为这就是这个对象所拥有的。所以这些属性 React 会更新。
并且您只能在 构造函数 中使用 this.state 更改初始状态,您不会在 React
中改变状态希望对您有所帮助
我假设你的问题是为什么当对象不一定改变时反应渲染。
调用setState时,react会触发对render函数的调用。此 'call' 渲染函数可能会或可能不会导致 'commit' 到 DOM。
它导致 'commit' 到 DOM,仅当渲染 'call' 创建的虚拟 DOM 与当前实际 [=25] 存在差异时=].
为了您的优化需求:重新渲染不是问题,而实际提交到 DOM 的重新渲染可能是问题。
我建议你完成这个 from kent c dodds