概念
结论:
Vue 在更新 DOM 时是异步执行的
流程:
1.只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更
2.如果同一个 watcher 被多次触发,只会被推入到队列中一次。
性能优化,这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的
3.在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。
异步事件更新2
(↑ 自己理解的数据更新意思)
Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationObserver 和 setImmediate,
如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替。
异步队列操作的语法
MutationObserver
setImmediate
语法解释
在工作中意义何在? 【获取更新后的 DOM 状态】
多数情况我们不需要关心这个过程,但是如果你想基于更新后的 DOM 状态来做点什么,这就可能会有些棘手。
虽然 Vue.js 通常鼓励开发人员使用“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们必须要这么做。
通过Vue全局方法和实例方法,我们可以获取到更新后的时间节点
入口函数中,可以使用全局方法:Vue.nextTick(fn)
单页面组件中,可以使用实例方法:vm.$nextTick()
官方例:
全局方法
<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
})
实例方法
<div id="example">{{message}}</div>
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) // => '已更新'
})
}
}
})