Vue.js在設計上使用MVVM模式。通過MVVM的模式拆分為視圖和數據兩部分,並將其分離。因此,你只需關心數據即可,DOM的事情Vue會幫你自動搞定。 Vue的生命周期鉤子比較常用的有: created 實例創建完成之後釣魚,此階段完成了數據的觀測等,但尚未掛載,$el還不可用。在需要初始化處理一 ...
Vue.js在設計上使用MVVM模式。通過MVVM的模式拆分為視圖和數據兩部分,並將其分離。因此,你只需關心數據即可,DOM的事情Vue會幫你自動搞定。
Vue的生命周期鉤子比較常用的有:
- created 實例創建完成之後釣魚,此階段完成了數據的觀測等,但尚未掛載,$el還不可用。在需要初始化處理一些數據時會比較有用
- mounted el掛載到實例上後調用,一般我們的第一個業務邏輯會在這裡開始
- beforeDestroy 實例銷毀之前調用。主要解綁一些使用addEventListener監聽的事件等。
angularJS和vue的監測數據變化區別
1, 首先糾正誤區,Angular並不是周期性觸發臟檢查。只有當UI事件,ajax請求或者 timeout 延遲事件,才會觸發臟檢查。Angular並不會遍歷作用域的屬性,它遍歷的是監聽器。一旦將數據綁定到UI上,就會添加一個監聽器(watcher )。
angularJS 作用域內的每一次變化,所有 watcher 都要重新計算。並且,如果一些 watcher 觸發另一個更新,臟檢查迴圈(digest cycle)可能要運行多次。 Angular 用戶常常要使用深奧的技術,以解決臟檢查迴圈的問題。有時沒有簡單的辦法來優化有大量 watcher 的作用域。
2, Vue.js 則根本沒有這個問題,因為它使用基於依賴追蹤的觀察系統並且非同步列隊更新,所有的數據變化都是獨立地觸發,除非它們之間有明確的依賴關係;
Vue 會在初始化實例時對屬性執行 getter/setter
轉化過程(遍歷此對象所有的屬性,並使用 Object.defineProperty 把這些屬性全部轉為 getter/setter),在內部它們讓 Vue 追蹤依賴,在屬性被訪問和修改時通知變化。每個組件實例都有相應的 watcher 實例對象,它會在組件渲染的過程中把屬性記錄為依賴,之後當依賴項的 setter
被調用時,會通知 watcher
重新計算,從而致使它關聯的組件得以更新。
並不是所有情況下,臟檢測性能都比不上觀察者模式。例如:
for迴圈中對綁定在scope上的變數做自增操作,在臟檢測的機制下,會等待到迴圈執行結束,然後一次更新,應用到界面上。 但是在基於setter的機制就慘了,每變化一次就需要更新一次,這樣性能就會極低。兩種不同的監控方式,各有其優缺點,最好的辦法是瞭解各自使用方式的差異,考慮出它們性能的差異所在,在不同的業務場景中,避開最容易造成性能瓶頸的用法。(具體看參考文獻 2)
參考文獻:
1,《Vue.js實戰》
3. vue官網 深入響應式原理