Vue提供了一個全局方法Vue.prototype.$apply
,當你使用Vue的異步更新時,有時候在回調中更新的數據不會觸發視圖更新,這時候可以使用$apply
方法手動觸發視圖更新。
export default {
data () {
return {
message: 'hello world'
}
},
methods: {
updateMessage () {
setTimeout(() =>{
this.message = 'hello vue'
// 在異步回調中更新數據,不會觸發視圖更新
console.log(this.$el.textContent) // hello world
}, 0)
this.$apply() // 手動觸發視圖更新
}
}
}
在上述代碼中,我們使用setTimeout
模擬異步回調,當數據更新時,我們使用$el.textContent
查看元素文本,發現文本還是之前的內容,這說明倆個原因,一是Vue的異步更新機制確保了Vue不會過分頻繁的再次更新dom,二是當數據更新時,回調中的異步操作沒法在更新后立即觸發,需要手動使用$apply
方法觸發視圖更新。
需要注意的是,在Vue2.x中,$apply
方法已被廢棄,推薦使用$nextTick
方法,$nextTick
方法用于在DOM更新隊列完成之后執行回調。
export default {
data () {
return {
message: 'hello world'
}
},
methods: {
updateMessage () {
this.message = 'hello vue'
this.$nextTick(() =>{
console.log(this.$el.textContent) // hello vue
})
}
}
}
上面的代碼中使用$nextTick
方法,當數據更新后執行回調,即使在回調中的異步操作也會立即觸發視圖更新。