React 18 新特性(一):自动批量更新

本文探讨React 18的新特性,即自动批量更新。在React 18之前,开发者需要手动调用`unstable_batchedUpdates`进行批量更新。然而,新版本引入了智能的自动批量更新,通过更新优先级来合并任务,简化了开发流程。文章通过代码示例解释了这一变化,并解答了关于新API、获取更新后数据以及优先级概念的常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本文已收录在 Github: https://github.com/beichensky/Blog 中,欢迎 Star,欢迎 Follow!

18 版本之前

经典面试题:setState 是同步还是异步

react 18 版本之前,在面试中经常会出现这个问题,那么答案又是什么样的呢?

  • React 合成事件中是异步的

  • hooks 中是异步的

  • 其他情况皆是同步的,例如:原生事件、setTimeoutPromise

看看下面这段代码的执行结果,就知道所言非虚了

class App extends React.Component {
   

    state = {
   
        count: 0
    }
    
    componentDidMount() {
   
        this.setState({
   count: this.state.count + 1})
        console.log(this.state.count);
        this.setState({
   count: this.state.count + 1})
        console.log(this.state.count);

        setTimeout(() => {
   
            this.setState({
   count: this.state.count + 1})
            console.log(this.state.count);
            this.setState({
   count: this.state.count + 1})
            console.log(this.state.count);
        });
        
    }

    render() {
   
        return <h1>Count: {
   this.state.count}</h1>
    }
}

有经验的同学肯定都知道,最终的结果是: 0 0 2 3

原因就是因为 componentDidMount 中的 setState 是批量更新,在整体逻辑没走完之前,不会进行更新。所以前两次打印结果都是 0,并且将两次更新合并成了一次。

而在 setTimeout 中,脱离了 React 的掌控,变成了同步更新,因为下方的 log 可以实时打印出即时的状态。

此时 React 的内部的处理逻辑我们可以写一段代码简单模拟一下:

  • 先声明三个变量,用来记录数据

    • isBatchUpdate: 判断是否批量更新的标志</

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值