JS 事件循环(宏/微任务) ↔ Vue ↔ React** 三者的关系

一、核心结论(先记死)

Vue 和 React 的异步更新底层,完全一样!

都是基于 JS 原生的 微任务(Microtask) 实现的。


二、三者关系大白话

1. JS 事件循环 = 地基

  • 同步 → 微任务 → 宏任务
  • 这是浏览器规则,所有框架都必须遵守

2. Vue = 用微任务做 DOM 更新

  • Vue 把 DOM 更新、nextTick 都放进 微任务
  • 执行顺序:
    同步代码 → 微任务(Vue更新DOM + nextTick) → 宏任务

3. React = 也用微任务做批量更新

  • React 18 之后的 自动批处理、Concurrent Mode
  • 底层也是 微任务 驱动
  • 执行顺序和 Vue 一模一样

三、最关键:Vue 和 React 在事件循环里的行为对比

完全一样的规则:

  1. 同步代码先执行
  2. 框架批量更新 DOM(微任务)
  3. 微任务清空
  4. 浏览器渲染(Layout / Paint)
  5. 最后执行宏任务(setTimeout)

代码对比(效果完全相同)

Vue3
js 复制代码
const count = ref(0)

const change = () => {
  count.value = 1
  console.log('同步:DOM还没变')  // 先走

  nextTick(() => {
    console.log('微任务:DOM更新了') // 再走
  })

  setTimeout(() => {
    console.log('宏任务:最后走') // 最后
  }, 0)
}
React 18+
js 复制代码
const [count, setCount] = useState(0)

const change = () => {
  setCount(1)
  console.log('同步:DOM还没变') // 先走

  // React 没有 nextTick,但用 Promise 就等价
  Promise.resolve().then(() => {
    console.log('微任务:DOM更新了') // 再走
  })

  setTimeout(() => {
    console.log('宏任务:最后走') // 最后
  }, 0)
}

输出顺序完全一样!

复制代码
同步:DOM还没变
微任务:DOM更新了
宏任务:最后走

四、为什么 React 没有像 Vue 一样讲事件循环?

因为:

  • Vue 暴露了 nextTick
  • React 隐藏了底层,自动批处理

但底层原理 100% 相同:

  • 都是异步更新 DOM
  • 都放在微任务
  • 都遵守 同步 → 微任务 →浏览器渲染→ 宏任务

五、一张图彻底打通所有关系

复制代码
JS 事件循环(地基)
  ↓
同步代码
  ↓
微任务(Vue DOM更新 / React批量更新)
  ↓
宏任务(setTimeout、ajax、UI渲染)

六、终极总结(面试必背)

  1. Vue 和 React 异步更新原理完全一样,都基于 JS 微任务
  2. 执行顺序永远是:同步 → 微任务(框架更新) → 宏任务
  3. Vue nextTick = React Promise.resolve().then()
  4. setTimeout 永远最后执行

相关推荐
M--Y4 小时前
LangGraph 工作流模式
开发语言·javascript·python·langchain·大模型·llm·langgraph
清晨Coding9 小时前
为什么用 React Developer Tools 查看组件树这么乱?
前端·react.js
johnjincaaaa9 小时前
猿人学第 18 题「jsvmp 洞察先机」逆向通关实录
javascript·后端
FungLeo12 小时前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构
总要学点什么12 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
ruanno_top15 小时前
选中一项后,焦点掉回了页面顶部:三个弹层的焦点还原
vue.js
小厨勺子16 小时前
我用AIUI给Rokid眼镜做了个随身换算智能体
javascript
夕水17 小时前
我用trae重构了ew-color-picker,一个插件化架构的现代颜色选择器
前端·javascript·开源
tryCbest18 小时前
Vue3——第 17 篇:模板引用(ref)与组件实例——操作 DOM 的正确姿势
vue.js·前端搭建
头发还在的女程序员19 小时前
Java在线租房系统源码解析:Spring Boot+Vue 3+UniApp房源管理与预约看房方案
java·vue.js·spring boot·租房小程序·租房系统·租房软件