$nextTick用法:將回調(diào)延遲到下次 DOM 更新循環(huán)之后執(zhí)行舞竿。在修改數(shù)據(jù)之后立即使用它枪孩,然后等待 DOM 更新。
updated用法:由于數(shù)據(jù)更改導(dǎo)致的虛擬 DOM 重新渲染和打補丁碟联,在這之后會調(diào)用該鉤子抗愁。當這個鉤子被調(diào)用時,組件 DOM 已經(jīng)更新衡查,所以你現(xiàn)在可以執(zhí)行依賴于 DOM 的操作瘩欺。
this.$nextTick()可以用作局部的數(shù)據(jù)更新后DOM更新結(jié)束后的操作,全局的可以用updated生命周期函數(shù)
在vue中操作DOM--this.$nextTick()
異步更新隊列
可能你還沒有注意到拌牲,Vue 在更新 DOM 時是異步執(zhí)行的俱饿。只要偵聽到數(shù)據(jù)變化,Vue 將開啟一個隊列塌忽,并緩沖在同一事件循環(huán)中發(fā)生的所有數(shù)據(jù)變更拍埠。
(也就是說數(shù)據(jù)變化后,DOM不會馬上更新土居,根據(jù)數(shù)據(jù)更新DOM的事件被放入異步隊列中了)
如果同一個 watcher 被多次觸發(fā)枣购,只會被推入到隊列中一次。這種在緩沖時去除重復(fù)數(shù)據(jù)對于避免不必要的計算和 DOM 操作是非常重要的擦耀。然后坷虑,在下一個的事件循環(huán)“tick”中,Vue 刷新隊列并執(zhí)行實際 (已去重的) 工作埂奈。
例如,當你設(shè)置 vm.someData = 'new value'
定躏,該組件不會立即重新渲染账磺。當刷新隊列時,組件會在下一個事件循環(huán)“tick”中更新痊远。多數(shù)情況我們不需要關(guān)心這個過程垮抗,但是如果你想基于更新后的 DOM 狀態(tài)來做點什么,這就可能會有些棘手碧聪。雖然 Vue.js 通常鼓勵開發(fā)人員使用“數(shù)據(jù)驅(qū)動”的方式思考冒版,避免直接接觸 DOM,但是有時我們必須要這么做逞姿。為了在數(shù)據(jù)變化之后等待 Vue 完成更新 DOM辞嗡,可以在數(shù)據(jù)變化之后立即使用 Vue.nextTick(callback)。這樣回調(diào)函數(shù)將在 DOM 更新完成后被調(diào)用滞造。
(在這個更新DOM的隊列結(jié)束后续室,就會調(diào)用nextTick,從而執(zhí)行里面的callback)
例如:
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) // => '已更新'
})
}
}
})
遇到過的問題:當使用異步調(diào)用到的資源來修改data的內(nèi)容時(比如數(shù)據(jù)更改后新增了一個dom)
this.$nextTick () {修改這個新增dom里面的內(nèi)容}
要放在修改data的代碼的后面谒养,不然可能callback中對于dom的修改不生效挺狰。