在vue中,data選項中定義的資料
資料改變,檢視自動響應,我們把這個情況稱之為:響應式原理
底層**實現響應式原理
vue2.0響應式原理的核心: es5的屬性object.defineproperty(物件,物件的key,描述符【控制物件屬性】)
object.defineproperty不支援ie8以及以下,所以vue就不支援了
物件攔截,陣列劫持
如何實現響應式原理呢?
// 1. 初始化資料定義
const data=
, arr:[1
,2,3
,4]}
// 2. render函式表示檢視渲染了
function
render()
// 3. observer就是觀察者,用於觀察data的變化
function
observer
(data);if
(typeof data===
'object')}
}// 4. reactive函式是對物件中的每乙個屬性做攔截
function
reactive
(obj,key,value)
,set
(val)}}
)}//5. 對陣列的方法進行劫持
陣列的原生方法不能用?就拷貝乙份陣列的新的原型,上面就有陣列的方法
const arrnewproto=object.
create
(array.prototype)
;對哪些方法進行重寫呢?
const arr=
['push'
,'splice'
,'pop'
,'shift'
,'unshift'];
arr.
foreach
(item=>})
observer
(data)
;//成功監聽到data中name值得變化
// data.name='zhangsan';
// data.car.price=2000;
一步步進行推導
1.問題:初始化資料data是乙個物件,修改物件中的資料時,data.name=『zhangsan』;
2.問題:當初始化資料data是乙個二層結構時,監聽不到二層結構?
解決方案:遞迴解決
3.問題:當set函式中傳入的val值與原先的值相同時,那就不需要進行檢視渲染
解決方案:傳入的新值與舊值進行判斷
4.問題:如果傳入的新值是乙個物件呢?
解決方案:observer(val);傳入的新值也有可能是物件,所以新值也需要做響應式攔截
5.問題:傳入的值也有可能是陣列?
思考:陣列的方法是原生的,不允許更改原生的方法,所以對陣列進行劫持,就需要從寫陣列的方法
解決方案:對陣列進行劫持
原生的方法監聽不到,一執行自己寫的push方法,就能監聽到,render函式一執行,就證明你做了push操作
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 方法,當...