vue中nexttick实现
Vue 中 nextTick 的实现原理
Vue 的 nextTick 是一个用于在 DOM 更新完成后执行回调的工具方法。其核心实现基于 JavaScript 的事件循环机制,确保回调在 DOM 更新后执行。
异步队列机制
Vue 会将 DOM 更新操作放入一个异步队列中,通过微任务或宏任务调度执行。nextTick 会将回调函数加入这个队列,确保在 DOM 更新后执行。
常见的实现方式包括:
- 优先使用
Promise(微任务) - 降级到
MutationObserver(微任务) - 进一步降级到
setImmediate(宏任务) - 最后使用
setTimeout(宏任务)
源码核心逻辑
以下是简化版的 nextTick 实现逻辑:
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) {
let _resolve;
callbacks.push(() => {
if (cb) {
try {
cb.call(ctx);
} catch (e) {
handleError(e, ctx, 'nextTick');
}
} else if (_resolve) {
_resolve(ctx);
}
});
if (!pending) {
pending = true;
if (useMicrotask) {
Promise.resolve().then(flushCallbacks);
} else {
setTimeout(flushCallbacks, 0);
}
}
if (!cb && typeof Promise !== 'undefined') {
return new Promise(resolve => {
_resolve = resolve;
});
}
}
使用场景
- 在数据变化后获取更新后的 DOM
- 在组件更新后执行某些操作
- 确保代码在下一个事件循环中执行
注意事项
- 微任务优先于宏任务执行,但某些场景可能需要强制使用宏任务
- 在 SSR 环境中实现会有所不同
- 多次调用
nextTick会在同一个 tick 中批量执行
与事件循环的关系
Vue 的更新机制利用了 JavaScript 的事件循环:
- 同步代码执行
- 微任务队列执行(Promise、MutationObserver)
- 宏任务队列执行(setTimeout、setImmediate)
nextTick 尽量使用微任务实现,确保更快的执行时机。







