vue nexttick实现
Vue 中 nextTick 的实现原理
Vue 的 nextTick 方法用于在 DOM 更新后执行回调函数,其核心基于 JavaScript 的事件循环机制。以下是其实现的关键点:
-
异步队列机制
Vue 会将nextTick的回调函数推入一个异步队列,确保在当前的同步代码执行完毕、DOM 更新后执行。优先使用微任务(Microtask)实现,如Promise.then或MutationObserver,降级方案为宏任务(Macrotask)如setImmediate或setTimeout。
-
实现代码简化版
let callbacks = []; let pending = false; function flushCallbacks() { pending = false; const copies = callbacks.slice(0); callbacks.length = 0; for (let i = 0; i < copies.length; i++) { copies[i](); } } function nextTick(cb, ctx) { callbacks.push(() => { if (cb) cb.call(ctx); }); if (!pending) { pending = true; if (typeof Promise !== 'undefined') { Promise.resolve().then(flushCallbacks); } else { setTimeout(flushCallbacks, 0); } } } -
微任务优先策略

- 现代浏览器中优先使用
Promise.then创建微任务,确保回调在 UI 渲染前执行。 - 在不支持
Promise的环境(如旧版 IE)降级到setTimeout,但会延迟到宏任务队列。
- 现代浏览器中优先使用
-
与 Vue 更新流程的关系
Vue 的 DOM 更新是异步的,同一事件循环内的数据变化会合并到同一更新周期。nextTick的回调会在这些更新完成后触发,从而获取最新的 DOM 状态。 -
使用场景示例
this.message = 'updated'; this.$nextTick(() => { console.log(this.$el.textContent); // 输出更新后的 DOM 内容 });
注意事项
- 微任务与宏任务的差异:微任务执行时机早于宏任务,可能影响依赖渲染结果的逻辑。
- 兼容性处理:Vue 内部会根据运行环境自动选择最优的异步方案。






