当前位置: 首页 > 面试题库 >

在React组件中多次使用this.setState会发生什么?

皮承基
2023-03-14
问题内容

我想检查一下当您多次使用this.setState时发生了什么(为了讨论而两次)。我认为该组件将被渲染两次,但显然它仅被渲染一次。我的另一个期望是,对setState的第二个调用可能会在第一个调用之上运行,但是您猜到了-
运行良好。

链接到JSfiddle

var Hello = React.createClass({
  render: function() {
    return (
      <div>
        <div>Hello {this.props.name}</div>
        <CheckBox />
      </div>
    );
  }
});

var CheckBox = React.createClass({
  getInitialState: function() {
    return {
      alex: 0
    };
  },

  handleChange: function(event) {
    this.setState({
      value: event.target.value
    });
    this.setState({
      alex: 5
    });
  },

  render: function() {
    alert('render');
    return (
      <div>
        <label htmlFor="alex">Alex</label>
        <input type="checkbox" onChange={this.handleChange} name="alex" />
        <div>{this.state.alex}</div>
      </div>
    );
  }
});

ReactDOM.render(
  <Hello name="World" />,
  document.getElementById('container')
);

如您所见,每个渲染器上都会弹出一个警告,提示“渲染器”。

您是否对其正常工作有解释?


问题答案:

React批处理状态更新发生在事件处理程序和生命周期方法中。因此,如果您在<div onClick />处理程序中多次更新状态,React将在重新渲染之前等待事件处理完成。

需要明确的是,这仅适用于React控制的综合事件处理程序和生命周期方法。例如,状态更新不在AJAX和setTimeout事件处理程序中批处理。



 类似资料:
  • 我是新来的反应,什么来理解为什么console.log在渲染函数内部被调用两次? 如果我不从组件扩展,而是使用功能,控制台只打印一次

  • react class组件在componentDidMount中调用初始化接口,有些时候会调用两次,通过断点发现顺序是componentDidMount->componentWillUnmount->componentDidMount,但不能稳定复现,调用的组件是页面的主入口,并非某个组件的子组件,请问有知道这个问题的么?

  • 我有一个组件,我设置了一个计数,让状态更新时,按钮点击。但是当我检查渲染时间时,每次我点击按钮它都会渲染两次。 https://codesandbox.io/s/brave-forest-yre6y?file=/src/App.js 我想知道: 为什么它是这样工作的

  • 我读在初始渲染时只被调用一次,但我看到它被渲染了多次。 似乎我创建了一个递归循环。 组件didMount调度动作来获取数据 一旦接收到数据,它就会触发成功操作,将数据存储在redux状态。 父反应组件连接到redux存储,并且具有mapStateToProps用于刚刚在上述步骤中更改的条目 父渲染子组件(通过变量编程选择) 子组件的组件didMount再次被调用 它消除了获取数据的操作 我想这就是

  • 我一直在寻找一个使用可重用模型对话框窗口的解决方案,但在那里我可以自由地使用内容,并在React中使用了高级组件模式。如下所述:https://stackoverflow.com/a/31564812. 虽然这最初似乎是可行的,但当我使用一个包装器包装不同的东西(在不同的时间)时,我会遇到麻烦。 首先,我要: 然后我做了: 和 然后我得到的是这两个组件共享它们的状态。当一个被定义时,另一个将显示与

  • 场景:我有两个片段,分别名为和。我从转到选择一个单元,使用