当前位置: 首页 > 知识库问答 >
问题:

如果我没有更改状态的引用,为什么react调用render起作用?[副本]

宿嘉
2023-03-14

那么为什么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>);
 }
const user = {...this.state.user}; // a new copy of object, so new refference

有什么想法吗?

共有1个答案

汪栋
2023-03-14

使用空对象设置状态是有效的,因为react对状态突变本身不做任何操作。相反,它只是使用state对象并创建更新的虚拟DOM,同时调用render方法,这也反映了状态的变化。

但是,进行状态突变的问题是,生命周期方法现在将无法清楚区分prevstatethis.state之间的差异,并且由于prevstatethis.state值都引用了同一个引用,所以大量比较将失败。

 类似资料:
  • 我想到的另一个Stackoverflow问题的解决方案是使用Stream.peek操作,但似乎仍然不正确,因为它会改变< code>Stream.peek方法中的状态。 同时在<code>流上研究(这里和这里)。查看用法是否可以改变状态我仍然不完全相信<code>流。peek不应改变状态(包括<code>流 下面是Javadoc所说的: 此方法主要用于支持调试,您希望在元素流经管道中的某个点时看到

  • 我通过使用map函数迭代来显示我的状态,这是一个数组。此外,我有一个按钮,在点击反转数组。 我认为我想做什么是相当明显的。但这对我不起作用,我不知道为什么。我必须单击两次来完成第一次还原,出现了奇怪的情况,即呈现的数组和Chrome中React开发工具在组件状态中显示的数组不匹配。 我无法解释这种行为。我开始认为这与我从道具中获得阵列有关,但我真的不知道。有什么想法吗?

  • 我试图使用反应组件在我的 在下面的例子中,它在不使用状态的情况下工作得很好 https://jsbin.com/paduyarase/edit?html输出 现在我在我的组件中引入usestate。我编译了下面的函数,使用的是javascript,但它不起作用。 此组件不工作https://jsbin.com/hefiretaru/edit?html输出 获取错误 错误:缩小的反应错误#321;参

  • 我正在尝试使用JS SDK在Dropbox上上传一个文件。下面是我试图调用函数的html代码: 这是定义函数的文件 但是,由于我不知道的原因,我的函数不能被调用。我得到错误“referenceerror:Dropupload is not defined”,我不知道这是否与问题有关,但我得到另一个错误:“syntaxerror:import declarations may only at top

  • 我正在经历React生命周期方法,所以一个问题出现在我的脑海中。在这里分享一下:我们能有力地调用React的render()函数吗? 就像我们在angular JS中调用$apply()一样

  • 问题内容: 我做了一个设计为使用ngModel指令附加到元素的指令。如果模型的值与某物匹配,则应将其设置为先前的值。在我的示例中,我正在寻找“ foo”,如果输入的是它,则将其设置回前一个。 我的单元测试在此方面通过的很好,因为它们仅查看模型值。但是在实践中,当“放回”触发器时,不会更新DOM。我们最好的猜测是,设置旧==新可以防止脏检查的发生。我逐步完成了$ setViewValueValue方