React 中 setState详解

最近复习了一些关于react的基础,记录一下,setState使用的细节。
setState的异步更新
自定义事件中为异步更新

<div>
  <h2>{this.state.message}</h2>
  <button onClick={e => this.changeText()}>改变文本</button>
  </div>
changeText() {
  this.setState({
    message: "Hello React"
  })
  console.log(this.state.message);  // Hello World, 并不能同步拿到最新值 Hello React
}

为什么setState设计为异步呢?
setState设计为异步,可以显著的提升性能;

如果每次调用setState都进行一次更新,那么意味着render函数会被频繁调用,界面重新渲染,这样效率是很低的;最好的办法应该是获取到多个更新,之后进行批量更新;
如果同步更新了state,但是还没有执行render函数,那么state和props不能保持同步;state和props不能保持一致性,会在开发中产生很多的问题

及时获取到setState异步更新后的值:
1.setState(partialState, callback) 通过回调,callback方法获取,

changeText() {
  this.setState({
    message: "Hello React"
  }, () => {
    console.log(this.state.message); // Hello React
  });
}

2.生命周期函数 componentDidUpdate 获取

componentDidUpdate(prevProps, provState) {
  console.log(this.state.message); // Hello React
}

setState的同步更新
setTimeout 中为同步更新

changeText() {
  setTimeout(() => {
    this.setState({
      message: "Hello React"
    });
    console.log(this.state.message); // Hello React
  }, 0);
}

原生DOM事件中为同步更新

const btnEl = document.getElementById("btn");
  btnEl.addEventListener('click', () => {
    this.setState({
      message: "Hello React"
    });
  console.log(this.state.message);  // Hello React
})

setState的数据合并

使用 Object.assign(target, …sources)来完成的,每次setState并没有直接替换state中的所有数据,而是覆盖差异项,就是setState中的key项

setState的方法合并

多个setState连续执行,最终只会执行一个,例子中最后counter只增加了 1

increment() {
  this.setState({
    counter: this.state.counter + 1
  });
  this.setState({
    counter: this.state.counter + 1
  });
  this.setState({
    counter: this.state.counter + 1
  });
}

setState(callback) 取消合并,例子中最后counter只增加了 3

increment() {
  this.setState((state, props) => {
    return {
      counter: state.counter + 1
    }
  })

  this.setState((state, props) => {
    return {
      counter: state.counter + 1
    }
  })

  this.setState((state, props) => {
    return {
      counter: state.counter + 1
    }
  })
  }

总结

在组件生命周期或React合成事件中,setState是异步; 在定时器或原生dom事件中,setState是同步;
setState数据合并,实际上是Object.assign(target, …sources)
通过setState(callback)的方式可取消setState的多个合并

感谢观看,有帮助的话点点赞点点关注谢谢哈。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在React,可以使用setState方法来更新组件的状态。如果要对状态进行取反操作,可以通过在setState使用回调函数来实现。例如,可以使用prevState参数来获取之前的状态值,然后在回调函数对其进行取反操作。以下是一个示例代码: ```javascript this.setState(prevState => ({ count: !prevState.count })); ``` 在这个例子,count状态的值会被取反并更新。请注意,setState是一个异步操作,所以在调用setState后立即访问状态的值可能不会得到最新的结果。如果需要在更新后获取最新的状态值,可以在setState的回调函数进行操作。 #### 引用[.reference_title] - *1* *2* [【React源码笔记】setState原理解析](https://blog.csdn.net/Johan666/article/details/118026728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ReactsetState方法详解](https://blog.csdn.net/AI_huihui/article/details/121843901)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值