Vue.nextTick() 和Vue.nextTick() 使用案例

4,221 阅读1分钟

在下次DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

虽然 vue.js 通常鼓励开发人员用 数据驱动 的方式思考, 避免直接接触 DOM ,但有时我们必须要这么做。 比如你在vue的生命周期的 mounted() 钩子函数进行的 DOM 操作一定要放在 Vue.nextTick()的回调函数中。

Vue.$nextTick(callback),当dom发生变化,更新后执行的回调。

因为在 mounted() 钩子函数执行的时候 DOM 其实并未进行任何的渲染,而此时进行的 DOM 操作无异于徒劳,所以此处一定要将 DOM 操作的js代码 放到 Vue.$nextTick() 的回调函数中。

Vue.$nextTick()不需要全局 Vue,在函数回调中的 this 将自动绑定到当前Vue实实例上。

Vue.component('example', {
  template: '<span>{{ message }}</span>',
  data: function () {
    return {
      message: '未更新'
    }
  },
  methods: {
    updateMessage: function () {
      this.message = '更新'
      console.log(this.$el.textContent) // => '未更新'
      this.$nextTick(function () {
        console.log(this.$el.textContent) // => '已更新'
      })
    }
  }
}

$nextTick() 返回的是一个 Promise 对象,所以可以使用新的 ES2016 async/await 语法完成相同的事:

methods: {
    updateMessage: function () {
      this.message = '更新'
      console.log(this.$el.textContent) // => '未更新'
      await this.$nextTick()
      console.log(this.$el.textContent) // => '已更新'
    }
}

Vue.nextTick(callback),当数据发生变化,更新后执行回调。

为了在数据变化之后等待 Vue完成更新 DOM,可以在数据变化之后立即使用 Vue.nextTick()。这样回调函数想在 Dom更新完成之后被调用。

<div id="example">{{message}}</div>

var vm = new Vue({
  el: '#example',
  data: {
    message: '123'
  }
})
vm.message = 'new message' // 更改数据
vm.$el.textContent === 'new message' // false
Vue.nextTick(function () {
  vm.$el.textContent === 'new message' // true
})