vue.js深入篇(一、響應式原理)

vue.js深入篇(一、響應式原理)

Vue 不允許在已經創建的實例上動態添加新的根級響應式屬性(root-level reactive properties)。然而它可以使用 Vue.set(object, key, value) 方法將響應屬性添加到嵌套的對象上:

vue.js深入篇(一、響應式原理)

您還可以使用 vm.$set 實例方法,這也是全局 Vue.set 方法的別名:

vue.js深入篇(一、響應式原理)

有時你想向已有對象上添加一些屬性,例如使用 Object.assign() 或 _.extend() 方法來添加屬性。但是,添加到對象上的新屬性不會觸發更新。在這種情況下可以創建一個新的對象,讓它包含原對象的屬性和新的屬性:

vue.js深入篇(一、響應式原理)

也有一些數組相關的問題,之前已經在列表渲染中講過。

vue.js深入篇(一、響應式原理)

異步更新隊列

你應該注意到 Vue 執行 DOM 更新是異步的,只要觀察到數據變化,Vue 就開始一個隊列,將同一事件循環內所有的數據變化緩存起來。如果一個 watcher 被多次觸發,只會推入一次到隊列中。然後,在接下來的事件循環中,Vue 刷新隊列並僅執行必要的 DOM 更新。Vue 在內部使用 Promise.then 和 MutationObserver 為可用的異步隊列調用回調 setTimeout(fn, 0).

例如,當你設置 vm.someData = ‘new value’,該組件不會馬上被重新渲染。當刷新隊列時,這個組件會在下一次事件循環清空隊列時更新。我們基本不用關心這個過程,但是如果你想在 DOM 狀態更新後做點什麼,這就可能會有些棘手。一般來講,Vue 鼓勵開發者沿著數據驅動的思路,儘量避免直接接觸 DOM,但是有時我們確實要這麼做。為了在數據變化之後等待 Vue 完成更新 DOM,可以在數據變化之後立即使用 Vue.nextTick(callback)。這樣回調在 DOM 更新完成後就會調用。例如:

vue.js深入篇(一、響應式原理)

vm.$nextTick() 這個實例方法在組件內使用特別方便,因為它不需要全局 Vue,它的回調 this 將自動綁定到當前的 Vue 實例上:

vue.js深入篇(一、響應式原理)


分享到:


相關文章: