Vue2-Vue.nextTick( [callback, context] )

152 阅读1分钟

Vue.nextTick( [callback, context] )

1# 定义

语法Vue.nextTick([callback, context])

在 Vue 中,更新 DOM 是异步执行的。当数据发生变化时, 首先会将所有变更缓冲在同一事件循环中,并去除重复操作,以避免不必要的计算和 DOM 操作;随后,Vue 会在下一个事件循环中刷新队列并执行实际操作。

在 Vue 内部会先尝试使用原生的 Promise.thenMutationObserversetImmediate 处理异步队列,如果不支持这些方法,则会回退到使用 setTimeout(fn, 0)。这样的机制确保了 Vue 在处理异步更新时的高效性和性能优化。

为了在数据变化后等待 Vue 完成更新 DOM,可以使用 nextTick 函数,确保在操作 DOM 之前获取到最新的状态。

2# 示例

(1)Vue.nextTick()
var vm = new Vue({
  el: "#app",
  data: {
    message: "old message",
  },
  template: `<div>{{ message }}</div>`,
});

// 两秒后更改数据
setTimeout(() => {
  vm.message = "new message"; // 更改数据
  console.log(vm.$el.textContent === "new message"); // false
  Vue.nextTick(function () { // 箭头函数 or 匿名函数皆可
    console.log(vm.$el.textContent === "new message"); // true
  });
}, 2000);
(2)this.nextTick()
new Vue({
  el: "#app",
  data: {
    message: "old message",
  },
  template: `<div>{{ message }}</div>`,
  mounted() {
    // 两秒后更改数据
    setTimeout(() => {
      this.message = "new message"; // 更改数据
      console.log(this.$el.textContent === "new message"); // false
      this.$nextTick(() => { // 箭头函数 or 匿名函数皆可
        console.log(this.$el.textContent === "new message"); // true
      });
    }, 2000);
  },
});
(3)this.$nextTick().then()
new Vue({
  el: "#app",
  data: {
    message: "old message",
  },
  template: `<div>{{ message }}</div>`,
  mounted() {
    // 两秒后更改数据
    setTimeout(() => {
      this.message = "new message"; // 更改数据
      console.log(this.$el.textContent === "new message"); // false
      this.$nextTick().then(() => { // 箭头函数 or 匿名函数皆可
        console.log(this.$el.textContent === "new message"); // true
      });
    }, 2000);
  },
});
(4)await this.$nextTick()
new Vue({
  el: "#app",
  data: {
    message: "old message",
  },
  template: `<div>{{ message }}</div>`,
  mounted() {
    // 两秒后更改数据
    setTimeout(async () => {
      this.message = "new message"; // 更改数据
      console.log(this.$el.textContent === "new message"); // false
      await this.$nextTick(); // 等待数据更新
      console.log(this.$el.textContent === "new message"); // true
    }, 2000);
  },
});