vue作為乙個mvvm框架,是如果對資料屬性實現響應式的呢?通過深入研究,發現它是通過object.defineproperty(只支援純物件)繫結get,set來實現的,下面就來**一下其中的原理。
/**
* @param obj 目標物件
* @param prop 目標物件的屬性
* @param descriptor [屬性描述符:資料描述符和訪問描述符兩種形式]
*/var obj = {};
var descriptor = object.create(null) // 沒有繼承的屬性
// 預設沒有enumerable,沒有configurabel,沒有writeable
descriptor.value = 'static';
object.defineporperty(obj, 'key', descriptor);
// 屬性描述符
object.defineporperty(obj, 'key', )
// 訪問描述符
var bvalue
object.defineproperty(obj, 'key', ,
set: function(newvalue) ,
eumerable: true,
configurable: true
})
vue在denfineproperty的方法上進行進一步的封裝
function definereactive(data,key,value) ,
set: function(newvalue) ,
eumerable: true,
writeable: true
})}
我們之所以要觀察observer,是為了當資料屬性發生變化的時候,通知那些使用到該屬性的地方。
這要我們就可以先把所有使用到該屬性依賴全部收集起來,當屬性改變的時候,迴圈通知所有的屬性依賴進行更新
在definereative的基礎上進一步實現
/**
* [definereactive description]
* @param data [物件obj]
* @param key [物件屬性]
* @param value [物件屬性的值]
* @return [description]
*/function definereactive(data,key,value) ,
set: function(newvalue)
value = newvalue}})
}// 進一步把收集依賴的部分封裝起來
class dep
addsub(sub: watcher)
removesub(sub: watcher)
depend()
} notify()
}}// 修改後的**
function definereactive(data,key,value) ,
set: function(newvalue)
})}
總結: 要觀察就要收集依賴到dep用於專門儲存依賴, 上面我們將所有儲存到dep陣列的叫做watcher。致這些watcher依賴是在vue中的templete,watch,computed中都要是收集的,當資料改變的時候就去通知到這些地方,這樣就需要抽象出乙個能夠處理不同情況的類,然後我們在依賴收集的時候只需要收集這些封裝好的類進來,通知也是通知到它乙個,然後它負責通知其他地方使用到該屬性的地方,這個類我們叫它watcher
class watcher
get()
update()
}
上面的**就是乙個完整的乙個watcher,所做的事情就是獲取和更新要用到的屬性
至此,單個屬性監測響應的整個過程就實現了,對於多個屬性的監測**實現如下,遍歷物件的所有屬性
function observe(obj)
}function definereactive(data,key,value) ,
set: function(newvalue)
})}
vue響應式布局 Vue 響應式原理
vue2 的資料偵測 在 src observer 目錄裡面,元件例項在初始化時,會呼叫 observe 函式處理 data function initdata vm observe 改寫了所有物件屬性的 getter setter 和陣列原型上的 7 個會改寫陣列方法,從而讓 data 變成可響應...
vue響應式原理
響應式系統是vue框架核心的部分,資料物件僅僅是普通的 js物件。當我們改變資料時,檢視也會被改變,本文就來 一下vue 的響應式原理。vue響應式的核心是使用了es5 新增的api object.defineproperty 因此vue不支援ie8 object.defineproperty的作用...
vue響應式原理
要了解響應式原理首先應該知道什麼是響應式 更改 vue的響應式原理是什麼 vue資料的雙向繫結是通過資料劫持結合發布訂閱模式,偵測到資料變化,然後通過object.defineproperty 物件對每個屬性的getter和setter進行劫持。當讀取 data 中的資料時自動呼叫 get 方法,當...