Vue原理分析總結
阿新 • • 發佈:2018-12-04
文章目錄
vue原始碼分析總結
MVVM框架基本實現原理
- 資料代理
- 模板解析
- 資料繫結
相關函式:
- 將偽陣列轉為真陣列:
[].slice.call(arr)
node.nodeType
: 得到結點型別(document
,element
,attribute
,text
)Object.defineProperty(obj, propertyName, props)
: 給物件新增屬性Object.keys(obj)
: 得到物件自身可列舉屬性組成的陣列 (IE8不支援)obj.hasOwnProperty(prop)
: 判斷prop
是否是obj
的自身屬性DocumentFragment
: 文件碎片(高效批量更新多個結點) 記憶體中儲存n
element
的容器物件
資料代理:
- 通過一個物件代理另一個物件來操作此物件的資料
Vue
資料代理: 通過vm
物件來代理data
物件中所有屬性的操作(get/set
)- 用到的是準備中的
3
和4
特性
模板解析(編譯):
基本流程:
- 將
el
的所有子結點取出, 新增到一個新建的文件fragment
物件中 - 對
fragment
中所有層次的子結點再記憶體中遞迴進行編譯解析處理 - 將解析處理後的元素塞回頁面
- 用到特性
6
和1
大括號表示式解析
- 根據正則物件得到匹配出的表示式字串: 子匹配
/RegExp.$1
- 從
data
- 將屬性值設定為文字結點的
textContent
事件指令解析:
- 從指令中取出事件名
- 根據指令的值從
methods
中得到對應的事件處理函式物件 - 給當前結點繫結指定事件名和回撥函式的
dom
事件監聽 - 指令解析完後,移除指令屬性
一般指令解析:
- 得到指令名和智力高表示式
- 從
data
中根據表示式得到對應的值 - 根據指令名確定需要操作元素結點的什麼屬性
- 將得到的表示式的值設定到對應的屬性上
- 移除元素的指令屬性
資料繫結:
- 利用資料劫持來實現資料繫結的效果.
- 通過
defineProperty()
來監視data
中所有屬性(任意層次,遞迴實現)資料的變化,一旦變化Dep
就發出通知更新介面 - 用到
3
和4
特性
observe(data, this)
- 被觀察者必須是一個物件
- 實現資料劫持
- 遍歷所有資料,建立
Dep
- 給
data
重新定義屬性,新增set/get
方法 - 建立
Dep
和Wacter
之間關係 - 監聽新值變化,
Dep
發出訂閱通知,遍歷所有相關wacter
進行更新 wacter
呼叫回撥函式更新介面
wacter(data)和Dep
compile
編譯解析表示式期間建立wacter
監視,每一個表示式就對應一個監視器Dep
: 初始化時給data
的屬性進行資料劫持時建立,與data
中的屬性一一對應Dep
和wacter
之間的關係是多對多
雙向資料繫結:
- 雙向資料繫結是建立在單項資料繫結的基礎之上
- 在解析v-model指令時,給當前元素新增input的監聽
- 當input等value值發生變化時,將最新的值賦值給當前表示式所對應的data屬性,從而更新頁面