当前位置: 首页 > news >正文

Vue 的 nextTick 的原理是什么?

Vue.nextTick 的核心作用是 在 DOM 更新完成后执行回调,它的原理和事件循环机制(Event Loop) 以及 微任务(Microtask) 紧密相关。

为什么需要 nextTick?

Vue 的数据更新是异步的,也就是:

  • 当你修改 data 时,Vue 并不会立刻更新 DOM

  • 它会将更新操作 推入一个队列,在 同一事件循环中合并多次修改,最后一次性更新 DOM(提升性能)

所以:

  • 如果你想在修改数据后,拿到最新的 DOM,就要等更新完成

  • 这就是 Vue.nextTick 的作用

nextTick 的原理

nextTick 的核心逻辑:

  1. 把回调放进一个任务队列中

  2. 选择一个合适的时机,在 DOM 更新完成后执行

为了保证 高效 + 兼容性,Vue 采用 优雅降级策略,优先使用 微任务,如果不支持,再退到宏任务。

执行优先级

Vue 内部的实现(简化版):

  1. Promise.then(微任务,现代浏览器支持)

  2. MutationObserver(微任务,旧版浏览器)

  3. setImmediate(IE 专用)

  4. setTimeout(fn, 0)(宏任务,兜底方案)

源码思路(Vue 2.x)
let callbacks = [];
let pending = false;function flushCallbacks() {pending = false;const copies = callbacks.slice(0);callbacks.length = 0;for (let cb of copies) {cb();}
}let timerFunc;// 优先使用 Promise
if (typeof Promise !== 'undefined') {const p = Promise.resolve();timerFunc = () => p.then(flushCallbacks);
} else if (typeof MutationObserver !== 'undefined') {// 用 MutationObserver 模拟微任务let counter = 1;const observer = new MutationObserver(flushCallbacks);const textNode = document.createTextNode(String(counter));observer.observe(textNode, { characterData: true });timerFunc = () => {counter = (counter + 1) % 2;textNode.data = String(counter);};
} else {// 兜底方案timerFunc = () => setTimeout(flushCallbacks, 0);
}export function nextTick(cb, ctx) {callbacks.push(() => {if (cb) cb.call(ctx);});if (!pending) {pending = true;timerFunc();}
}
核心点
  • 利用微任务优先级:在当前事件循环的尾部、DOM 更新后执行回调

  • 批量处理:同一事件循环内的多次 nextTick,只会触发一次真正的异步调度(性能优化)

简单流程图

修改 data  →  Vue 标记更新 →  异步队列执行 patch →  DOM 更新完成 →  nextTick 回调执行
和 setTimeout 区别
  • nextTick = 微任务(大多数情况下)

  • setTimeout = 宏任务,执行会比微任务晚一拍

  • 所以 nextTick 比 setTimeout(..., 0) 更快

http://www.sczhlp.com/news/11177/

相关文章:

  • ARM CPU的 intrinsics指令集 - svcmpgt_u32
  • 河南萌新联赛2025第(五)场:信息工程大学”题解
  • IP_UV_PV介绍
  • Flutter 接入 Line 登录
  • c语言之关于AT指令连接MQTT时如何区分连接失败和中途失败
  • 路由介绍
  • 2025牛客暑期多校训练营9
  • md目录测试 - zlay
  • 普通目录测试 - zlay
  • Python提取Srec或Hex文件数据
  • ArcGisPro 编程批量分析、发布和覆盖地图服务
  • 【分享】对着 WBLT 写了(WBLT 学习报告)
  • RidgeBot 5.4.5 - 基于 AI 的主动安全验证平台
  • 函数指针用法
  • Microsoft Office LTSC 2024 for Mac (Microsoft 365) 16.100 - 文档、电子表格、演示文稿和电子邮件
  • Studio 3T 2025.14 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
  • 抖音福袋扭蛋机,抖音抢福袋工具
  • Luogu P8250 交友问题 题解 [ 蓝 ] [ 根号分治 ] [ Bitset ] [ 复杂度均摊 ]
  • Cisco Catalyst 9000 Series Switches, IOS XE Release 17.18.1 ED
  • 电脑不能连续打字,光标总是自动消失解决办法
  • 集训内容总结 day14:模拟赛 Round7
  • 数据库字段排序:desc 90怎么会在827之前?
  • tcp三次握手四次挥手介绍
  • 前端依赖库源码修改神器——patch-package 使用指南
  • Linux 的开机启动顺序
  • 【CAPL】创建路由功能并测试,Graphics的使用
  • 【自学嵌入式:stm32单片机】PWM驱动LED呼吸灯
  • Apache DolphinScheduler 7 月社区月报 | 关键修复与性能优化全面推进
  • 深度学习在计算机视觉领域的现状与未来
  • 智能制造网络质量保障Ⅱ:德承DX-1200多网口工控机在Linux系统下的网络性能测试指南 - Johnny