如果我没有更改状态的引用,为什么反应调用渲染函数? [重复]

问题描述 投票:2回答:1

这个问题在这里已有答案:

那么为什么在这种情况下反应调用会呈现:

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

有任何想法吗?

reactjs state
1个回答
3
投票

使用空对象设置状态是有效的,因为react对状态变异本身没有任何作用。相反,它只是使用状态对象并在调用render方法时创建更新的Virtual DOM,这也反映了状态突变。

然而,进行状态变异的问题在于,生命周期方法现在无法清楚地区分prevStatethis.state,并且由于prevStatethis.state值都将指代相同的参考,因此许多比较将失败。

© www.soinside.com 2019 - 2024. All rights reserved.