vm.$nextTick( [callback] )
官方解釋: 將回調(diào)延遲到下次 DOM 更新循環(huán)之后執(zhí)行
要理解這句話羽圃,首先要了解一下vue的異步更新隊(duì)列灿渴,Vue 異步執(zhí)行 DOM 更新探越。只要觀察到數(shù)據(jù)變化雷客,不會立即更新DOM,Vue 將開啟一個(gè)隊(duì)列,并緩沖在同一事件循環(huán)中發(fā)生的所有數(shù)據(jù)改變牍氛。如果同一個(gè) 數(shù)據(jù)被的多次 改變猜敢,只會被推入到隊(duì)列中一次。例如耐量,當(dāng)你設(shè)置 vm.someData = 'new value' 飞蚓,對應(yīng)的DOM更新會被推到一個(gè)隊(duì)列里,該組件不會立即重新渲染廊蜒,會在當(dāng)前tick完畢后趴拧,在下一個(gè)tick中渲染DOM。在事件循環(huán)中山叮,每進(jìn)行一次循環(huán)操作稱為tick著榴。而nextTick函數(shù)就是vue提供的一個(gè)實(shí)例方法,數(shù)據(jù)更新后等待下一個(gè)tick里Dom更新完后執(zhí)行回調(diào)屁倔,回調(diào)的 this 自動綁定到調(diào)用它的實(shí)例上脑又。
例如:
html:
<span class="test">{{egData}}</span>
<el-button @click="changeData">改變</el-button>
js:
new Vue({
data () {
return {
egData: 'old Message'
}
}
methods: {
changeData () {
this.egData = 'new Message'
console.log($('.test').html(), '-----------------------')
}
}
})
結(jié)果: 第一次點(diǎn)擊輸出 old Message -----------------------,第二次點(diǎn)擊輸出 new Message -----------------------
使用$nextTick:
js:
new Vue({
data () {
return {
egData: 'old Message'
}
}
methods: {
changeData () {
this.egData = 'new Message'
this.$nextTick(function () {
console.log($('.test').html(), '-----------------------')
})
}
}
})
結(jié)果:不管第幾次點(diǎn)擊,都輸出 new Message -----------------------
$nextTick使用場景:
**1问麸、數(shù)據(jù)更新后想要馬上操作新的DOM往衷,需要把操作寫在nextTick的回調(diào)里
2、在created鉤子函數(shù)里需要操作DOM严卖,也可以把操作寫在nextTick的回調(diào)里,(created鉤子函數(shù)里還沒有掛載dom席舍,所以直接操作會有問題)
$forceUpdate()
迫使Vue實(shí)例重新(rander)渲染虛擬DOM,注意并不是重新加載組件哮笆。結(jié)合vue的生命周期来颤,調(diào)用$forceUpdate后只會觸發(fā)beforeUpdate和updated這兩個(gè)鉤子函數(shù),不會觸發(fā)其他的鉤子函數(shù)稠肘。它僅僅影響實(shí)例本身和插入插槽內(nèi)容的子組件福铅,而不是所有子組件。
$forceUpdate()使用場景:
1项阴、當(dāng)在data里沒有顯示的聲明一個(gè)對象的屬性滑黔,而是之后給該對象添加屬性,這種情況vue是檢測不到數(shù)據(jù)變化的鲁冯,可以使用$forceUpdate()**
html:
<span class="test">{{egData.value}}</span>
<el-button @click="changeData">改變</el-button>
js:
egData: {}
...
changeData () {
this.egData.value = 'oldValue'
this.$forceUpdate() // dom會更新
}
但是這種做法并不推薦拷沸,官方說如果你現(xiàn)在的場景需要用forceUpdate方法 ,那么99%是你的操作有問題,如上data里不顯示聲明對象的屬性薯演,之后添加屬性時(shí)正確的做法時(shí)用 vm.$set() 方法撞芍,所以forceUpdate請慎用