鑒于公司統一框架之后大家對于vue的使用都已經基本上手,在項目運用中有很多由研發部門自定義的組件,那么,自定義組件,elementui組件,甚至于自編寫組件應該如何設計呢?這就需要大家對vue的底層有一定了解。
vue頁面是由JavaScript語言+vue標簽+css語法共同組成,nodejs編譯的核心語言也是JavaScript,先來了解下該語言的運行的兩個階段:
預解析(將function定義的函數/var等定義的變量聲明提前準備)
從上到下執行
js運行機制的特點:
單線程,這點很好理解,前面的事情結束才執行后面的事件
事件循環EventLoop,包括setTimeout(延時器)和setInterval(定時器)、DOM事件、ES6中的Promise、Ajax異步請求。在主線程執行的時候,會形成一個執行棧以及一個任務隊列,棧中的同步任務執行完成之后會讀取任務隊列,異步任務就會進入棧開始執行,讀取過程會不斷重復,如圖:
第一步,newvue() 初始化生命周期等,主要實現以下三個內容:
1、通過observer 對data 進行監聽,并且提供訂閱某個數據項的變化
2、把template 解析成一段document fragment,然后解析其中的directive,得到每一個directive 所依賴的數據項及其更新方法。
3、watcher把directive 中的數據依賴訂閱在對應數據的observer 上,當數據變化的時候,就會觸發observer,進而觸發相關依賴對應的視圖更新方法,以達到模板關聯效果。
第二步,調用$mount來執行掛載函數。指定一個掛載節點,模板編譯、顯示。
第三步,啟動編譯器compile生成渲染函數,并生成虛擬節點樹,數據更新改變的數據即是這個虛擬dom上的數值,更新之前通過diff算法的比較,將新老值進行比較,以實現最小的dom更新。為減少頁面渲染的次數和數量,compile編譯渲染函數同時會進行依賴收集,通過這個這個步驟監視頁面數據,當數據發生變化時以確認需要更新的dom節點。
第四步,watcher觀察數據變化,調用渲染函數。
第五步,執行patch更新界面。
VUE在初始化數據時,會給data 中的屬性通過調用object.defineProperty()來劫持各個屬性的getter 和setter,在數據變化的時候通知訂閱者,并觸發相應的回調。
因為Object.defineProperty存在缺點,3.0版本后開始使用Proxy實現響應式,兩者對比如下:
Object.defineProperty只能劫持對象的屬性,因此需要遍歷對象的每個屬性,而Proxy 可以直接代理對象
Object.defineProperty 對新增屬性需要手動進行觀察,由于Object.defineProperty劫持的是對象的屬性(第一點),所以新增屬性時,需要重新遍歷對象,對其新增屬性再使用
Object.defineProperty 進行劫持(正是這個原因導致我們在給 data中的數組或對象新增屬性時,需要使用$set 才能保證視圖可以更新)
Proxy 性能高,支持13種攔截方式
compile 的主要作用是根據template 模板,生成render函數。通過核心邏輯獲取dom,遍歷dom,獲取{{}}格式的變量,以及每個dom的屬性,截獲k-@等開頭設置響應式。
以上是關于VUE底層結構的淺顯分析,通過JS運行機制特點,介紹VUE源碼構建和編譯compile工作原理,希望對大家后續vue的使用開發有所幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130113.html
摘要:淺析的特點之一就是響應式,但數據更新時,并不會立即更新。盡管已經更新,但新增的元素并不立即插入到中。實際在中,執行了,這也是自動綁定到執行上下文的原因。在內,使用數組保存回調函數,表示當前狀態,使用函數來執行回調隊列。 Vue.nextTick 淺析 Vue 的特點之一就是響應式,但數據更新時,DOM 并不會立即更新。當我們有一個業務場景,需要在 DOM 更新之后再執行一段代碼時,可以...
摘要:前言本文的目的是閱讀理解的源碼,作為集合中重要的一個角色,平時用到十分多的一個類,深入理解它,知其所以然很重要。 前言 本文的目的是閱讀理解HashMap的源碼,作為集合中重要的一個角色,平時用到十分多的一個類,深入理解它,知其所以然很重要。本文基于Jdk1.7,因為Jdk1.8改變了HashMap的數據結構,進行了優化,我們先從基礎閱讀,之后再閱讀理解Jdk1.8的內容 HashMa...
摘要:它由微軟架構師和開發,通過利用微軟圖形系統和的互聯網應用派生品的特性來簡化用戶界面的事件驅動程序設計。微軟的和架構師之一于年在他的博客上發表了。更改時會得到提醒這個情況是一個單向流。 前言 記得四個月前有一次面試,面試官問我 MVVM 是什么,MVVM 的本質是什么。我大腦一片混亂,那時我對 MVVM 的認知就只是雙向綁定和Vue,以這個關鍵字簡單回答了幾句,我反問 MVVM 的本質是...
摘要:它主要做了件事初始化容器,并將元素添加到容器里維護這樣我們再調用的方法直接就返回了,不需要再次遍歷和統計的過程。維護實時的維護,及時刪除總結整體上是對底層的二次封裝,很好的處理了各種細節,比如子容器的判空處理,的計算效率,的維護等。 在日常開發中我們通常有需要對 List 容器進行分組的情況,比如對下面的list數據根據name字段來進行分組: [ { date...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20