如果我没有更改状态的引用,为啥 React 会调用渲染函数? [复制]

Posted

技术标签:

【中文标题】如果我没有更改状态的引用,为啥 React 会调用渲染函数? [复制]【英文标题】:Why does react call render function if I have not changed the reference of the state? [duplicate]如果我没有更改状态的引用,为什么 React 会调用渲染函数? [复制] 【发布时间】:2019-02-15 18:32:51 【问题描述】:

那么为什么在这种情况下 react 调用会渲染:

class MyComponent extends React.Component 
 constructor(props) 
  this.state = 
   user:  name: 'john' ,
  ;
 

 render() 
  return (
   <div>
    Name: this.state.user.name
    <button onClick=() => 

     const user = this.state.user;
     user.name = 'Michael';

     // this works, also this.setState() with empty json works too
     this.setState( user );  
    > Change name </button> 
   </div>);
 

我所期望的是 React 不会检测到任何更改,并且为了让上述代码能够制作用户对象的副本,以便 React 检测到这样的更改:

const user = ...this.state.user; // a new copy of object, so new refference

有什么想法吗?

【问题讨论】:

【参考方案1】:

使用空对象设置状态是有效的,因为 react 不会对状态突变本身做任何事情。相反,它只是使用状态对象并在调用渲染方法时创建更新的虚拟 DOM,这也反映了状态突变。

但是,进行状态突变的问题在于,生命周期方法现在无法清楚地区分 prevStatethis.state,并且由于 prevStatethis.state 值将导致很多比较失败两者都引用相同的引用。

【讨论】:

很好的解释!

以上是关于如果我没有更改状态的引用,为啥 React 会调用渲染函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我的 Redux 状态发生了变化,为啥 React 没有触发重新渲染?

为啥组件在状态更改后不重新渲染。在 react-native 函数组件中

为啥从 React 的 useEffect 依赖列表中省略函数是不安全的?

调用 React Setstate 回调但延迟渲染

为啥我不能更改状态栏的颜色?

如果我没有进行更改,为啥我需要同步 NSUserDefaults?