在下次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
})
复制代码