关于更新数据后虚拟dom对比更新渲染
拿Vue官网的一个例子
<body>
<div id="app">
<example></example>
</div>
<script src="/base/vue.js"></script>
<script>
Vue.component("example",{
template:"<div><p>{{message}}</p ref='a'><button @click='updataMessage'>《更新按钮》</button></div>",
data(){
return{
message:"未更新"
}
},
methods:{
updataMessage(){
this.message = "已更新"
console.log(this.$el.textContent) //未更新
console.log(this.message) //已更新
this.$nextTick(()=>{
console.log(this.$el.textContent)// 已更新
})
}
}
})
new Vue({
el:"#app"
})
</script>
</body>
点击按钮执行updataMessage方法
console.log(this.$el.textContent)输出:“未更新”
console.log(this.message) 输出:“已更新”
但是页面上显示“已更新”
在数据发生改变时,生成新的虚拟dom和之前的虚拟dom进行对比,将对比的差异重新渲染,这个操作是异步执行的,当虚拟dom在做对比的时候console.log(this.$el.textContent)已经执行,所以就导致新的真实dom元素还没有渲染完成,textContent就已经执行完了
Vue中提供了$nextTick方法,官方的解释:
在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。并且在组件内使用 $nextTick()这个方法特别方便,因为它不需要全局Vue,并且回调函数中的this自动绑定到当前的Vue实例上
所以后面的this.$nextTick中的console.log(this. $el.textContent)会直接输出新的dom里的内容,
输出:“已更新”
《个人笔记》