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

在React组件中多次使用this.set状态时会发生什么?

南宫浩皛
2023-03-14

我想检查当你多次使用this.set状态时会发生什么(为了讨论,两次)。我以为组件会被渲染两次,但显然它只被渲染了一次。我的另一个期望是,第二个setState调用可能会超过第一个,但是你猜对了——工作正常。

链接到JSFIDLE

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')
);

正如您将看到的,在每个渲染上都会弹出一个“渲染”警报。

你能解释为什么它工作正常吗?

共有2个答案

汪文光
2023-03-14

setState()方法不会立即更新组件的状态,它只是将更新放在稍后处理的队列中。React可以将多个更新请求批处理在一起,以使渲染更加高效。因此,当您尝试根据组件的先前状态更新状态时,必须采取特殊的预防措施。

例如,以下代码仅将state value属性增加1,即使调用了4次:

 class Counter extends React.Component{
   constructor(props){
     super(props)
    //initial state set up
     this.state = {value:0}
   }
   componentDidMount(){
    //updating state
    this.setState({value:this.state.value+1})
    this.setState({value:this.state.value+1})
    this.setState({value:this.state.value+1})
    this.setState({value:this.state.value+1})
   }
   render(){
    return <div>Message:{this.state.value}</div>
   }
}

要在更新后使用状态,请执行回调参数中的所有逻辑

//this.state.count is originally 0
this.setState({count:42}, () => {
  console.log(this.state.count)
//outputs 42
})

setState(updater,[callback])方法可以将updater函数作为其第一个参数,根据以前的状态和属性更新状态。updater函数的返回值将与以前的组件状态进行简单合并。该方法异步更新状态,因此在状态完全更新完成后将调用一个选项回调。

例子:

this.setState((prevState, props) => { 
return {attribute:"value"}
})

以下是一个如何基于先前状态更新状态的示例:

    class Counter extends React.Component{
      constructor(props) {
        super(props)
    //initial state set up
        this.state = {message:"initial message"}
    }
      componentDidMount() {
    //updating state
        this.setState((prevState, props) => {
          return {message: prevState.message + '!'}
        })
     }
     render(){
       return <div>Message:{this.state.message}</div>
     }
  }
巩光誉
2023-03-14

对事件处理程序和生命周期方法中发生的状态更新作出反应。因此,如果在

明确地说,这只适用于反应控制的合成事件处理程序和生命周期方法。例如,状态更新不会在AJAX和setTimeout事件处理程序中成批进行。

 类似资料:
  • 问题内容: 我想检查一下当您多次使用this.setState时发生了什么(为了讨论而两次)。我认为该组件将被渲染两次,但显然它仅被渲染一次。我的另一个期望是,对setState的第二个调用可能会在第一个调用之上运行,但是您猜到了- 运行良好。 链接到JSfiddle 如您所见,每个渲染器上都会弹出一个警告,提示“渲染器”。 您是否对其正常工作有解释? 问题答案: React批处理状态更新发生在事

  • 在react项目中,子组件通过useImperativeHandle将自身的两个setState方法暴露给父组件,父组件通过ref调用这些方法的时候其中一个状态(skuBreak)出现了异常,又会再次被初始化成false,但是getDisabledLabel代码运行是没问题的,打印出来的skuBreak虽然又变回了false,但是展示在页面上依然是‘xxx’, 子组件: 父组件调用 希望大佬告知原

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

  • 本文向大家介绍描述下在react中无状态组件和有状态组件的区别是什么?相关面试题,主要包含被问及描述下在react中无状态组件和有状态组件的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 1,无状态组件主要用来定义模板,接收来自父组件props传递过来的数据,使用{props.xxx}的表达式把props塞到模板里面。无状态组件应该保持模板的纯粹性,以便于组件复用。创建无状态组件如下: v

  • 打字稿:2.8。3 @类型/反应:16.3。14 函数组件中的返回类型是,当我将组件声明为(React.StatelessComponent的别名)。 出现了三个错误: >

  • 我第一次尝试React钩子,一切似乎都很好,直到我意识到当我获取数据并更新两个不同的状态变量(数据和加载标志)时,我的组件(数据表)会呈现两次,尽管对状态更新器的两次调用都发生在同一个函数中。下面是我的api函数,它将两个变量都返回到我的组件中。 在普通的类组件中,您只需调用一次来更新状态,状态可能是一个复杂的对象,但“挂钩方式”似乎是将状态拆分为更小的单元,其副作用似乎是在单独更新时多次重新呈现

  • 问题内容: 我试图在ES6中使用有状态的React组件,但是当我定义一个构造函数时,在多次渲染该组件(从其父对象)时,构造函数将仅被调用一次。示例如下所示。 这不会更新渲染的输出(它将始终为),但是日志将输出: 这是一个JSFiddle:http : //jsfiddle.net/jor0xu1a/1/ 我知道该示例不需要状态,但是我尝试使其尽可能简单以显示我的问题。 我想念什么? 问题答案: 我

  • 问题内容: 我正在尝试新的React Hooks,并有一个带有计数器的Clock组件,该计数器应该每秒增加一次。但是,该值不会增加到超过一。 问题答案: 原因是传递给的闭包中的回调仅访问第一个渲染器中的变量,而无法访问后续渲染器中的新值,因为第二次未调用。 回调中的值始终为0 。 就像您熟悉的状态挂钩一样,状态挂钩有两种形式:一种是处于更新状态的状态,另一种是将当前状态传入的回调形式。您应该使用第