当前位置:首页 > VUE

vue nexttick 实现

2026-03-27 19:57:28VUE

Vue nextTick 实现原理

Vue 的 nextTick 用于在下次 DOM 更新循环结束之后执行延迟回调,常用于获取更新后的 DOM 状态。其核心实现基于 JavaScript 的事件循环机制。

源码实现分析

Vue 2.x 和 Vue 3.x 的 nextTick 实现略有不同,但核心逻辑类似。以下是关键实现逻辑:

// Vue 2.x 实现
const 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]()
  }
}

let timerFunc

// 优先使用微任务
if (typeof Promise !== 'undefined') {
  const p = Promise.resolve()
  timerFunc = () => {
    p.then(flushCallbacks)
  }
} else if (typeof MutationObserver !== 'undefined') {
  // 回退到 MutationObserver
} else if (typeof setImmediate !== 'undefined') {
  // 回退到 setImmediate
} else {
  // 最后使用 setTimeout
  timerFunc = () => {
    setTimeout(flushCallbacks, 0)
  }
}

export function nextTick(cb, ctx) {
  callbacks.push(() => {
    if (cb) {
      try {
        cb.call(ctx)
      } catch (e) {
        handleError(e, ctx, 'nextTick')
      }
    }
  })
  if (!pending) {
    pending = true
    timerFunc()
  }
}

实现机制

Vue 的 nextTick 通过维护一个回调队列实现异步执行。当调用 nextTick 时,回调函数会被推入队列,通过微任务或宏任务机制延迟执行。

微任务优先策略确保回调在 DOM 更新后立即执行。现代浏览器环境下通常使用 Promise.then,不支持时降级到 MutationObserversetImmediatesetTimeout

使用场景

// 获取更新后的 DOM
this.message = 'updated'
this.$nextTick(() => {
  console.log(this.$el.textContent) // 输出 'updated'
})

// 结合 async/await
async updateMessage() {
  this.message = 'updated'
  await this.$nextTick()
  console.log(this.$el.textContent)
}

注意事项

nextTick 的回调执行时机取决于 JavaScript 事件循环。微任务版本的 nextTick 会在当前事件循环的末尾执行,早于 setTimeout 等宏任务。

vue nexttick 实现

在 Vue 3 中,nextTick 直接基于 Promise 实现,不再考虑降级方案。其行为更一致,但原理与 Vue 2 类似。

标签: vuenexttick
分享给朋友:

相关文章

vue实现上移下移插件

vue实现上移下移插件

实现上移下移功能的 Vue 插件 在 Vue 中实现列表项的上移和下移功能,可以通过自定义指令或组件封装的方式完成。以下是两种常见实现方式: 基于数组操作的通用方法 通过操作数组索引实现元素位置交换…

vue 实现排序

vue 实现排序

Vue 实现排序的方法 使用计算属性实现排序 通过计算属性对数组进行排序,可以保持原始数据不变。示例代码展示了如何对列表按名称升序排序: <template> <div>…

vue搜索实现

vue搜索实现

Vue 搜索功能实现方法 基于计算属性的搜索 在 Vue 中可以通过计算属性实现简单的搜索功能。这种方式适合小型数据集,利用 JavaScript 的 filter 方法进行筛选。 data() {…

vue实现addclass

vue实现addclass

Vue 实现动态添加 class 的方法 在 Vue 中动态添加 class 可以通过多种方式实现,以下是常见的几种方法: 使用对象语法 通过绑定一个对象到 :class,可以动态切换 class…

vue实现Pop

vue实现Pop

Vue 实现 Popover 组件的方法 使用 Vue 内置指令 v-show/v-if 和事件监听 通过 Vue 的指令和事件绑定实现基础的 Popover 功能。定义一个布尔值控制 Popover…

vue工序实现

vue工序实现

Vue 工序实现方法 在Vue中实现工序(或流程)功能,通常涉及状态管理、组件通信和动态渲染。以下是几种常见方法: 使用动态组件 通过Vue的<component :is="currentCo…