Vue響應式原理

2021-10-08 10:25:54 字數 1559 閱讀 4521

在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 方法,當...