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 永远最后执行

相关推荐
卓怡学长1 分钟前
w233基于vue和springboot的宠物管理系统的设计与实现
java·vue.js·spring boot·spring·intellij-idea
hanchenxing40 分钟前
自动化脚本“卡住无输出“怎么办: 一次 WebSocket 挂死的排查与自愈模板
运维·javascript·chrome·websocket·自动化·自动化爬虫
津津有味道1 小时前
Web网页写网址到424DNA标签Javascrip源码
javascript·nfc·424dna·写网址·加密提交
梨涡泥窝2 小时前
JavaWeb——基于 Spring Boot + Vue 的图书管理系统的设计与实现
vue.js·spring boot·后端
宁风3 小时前
JavaScript:函数体系-1
前端·javascript
oooo_z3 小时前
美股历史K线数据API接口选型指南:iTick覆盖1分钟到月线全周期
服务器·前端·javascript
今日无bug3 小时前
从 0 到 1 搭建端侧 AI 项目:DeepSeek-R1 + WebGPU + React + TS + Tailwind 全栈笔记
前端·react.js·typescript
mONESY4 小时前
LangChain 结构化输出三兄弟:ToolCall、OutputParser、withStructuredOutput 彻底讲透
javascript
知兀4 小时前
【前端】受控和非受控组件
前端·javascript·react
晴天164 小时前
JavaScript 与 Java 垃圾回收机制对比
java·开发语言·javascript