vue響應式原理

2021-10-21 10:57:43 字數 2846 閱讀 2146

在資料變化的時候,檢視也會隨著改變,這就是響應式

vue使用object.defineproperty 中getter和setter方法中的觀察者模式來實現響應式

這個方法是物件方法,在乙個物件上定義一些新的屬性及方法,或改變物件的現有方法,並返回這個物件。

舉個示例看一下:

var mval =0;

var o =

;object.

defineproperty

(o,'m'),

set:

function

(newval),

enumerable :

true

, configurable :

true

}o.m =88;

console.

log(o.m)

;// 88

分析:當呼叫o.m給物件o中的m屬性賦值的時候,會呼叫set方法,將m的值賦給mval,此時就會呼叫get方法,獲取這個值。

通過這種方式我們就可以實現乙個簡單的vue雙向繫結了,給data中的所有屬性加上get和set方法。

什麼是觀察者模式?

觀察者模式分為註冊環節與發布環節。

將需要修改的屬性集中註冊一下,當處理完後一起發布出去。

function

observer()

notify()

}依次註冊多個想要執行的函式

const wantcake =

newobserver()

;wantcake.

register

(console.

log(

'call dish'))

;wantcake.

register

(console.

log(

'call jaks'))

;wantcake.

register

(console.

log(

'call mejdh'))

;在完成後通知所有客戶並執行函式

wantcake.

notify

()

原理解析

首先參考一張原理圖

我們分3個步驟來解釋

1、init階段,vue例項的data屬性reactive化,加上get、set方法

function

definereactive

(obj: object, key: string,

...)

,set

:function

reactivesetter

(newval),

enumerable :

true

, configurable :

true}}

const dep

}notify()

}}

這裡的dep是乙個觀察者類,每乙個屬性都有乙個dep,呼叫getter時去dep裡註冊函式,在呼叫setter時,執行註冊的函式。

2、mount階段

mountcomponent

(vm: component, el:

?element,

...)

newwatcher

(vm, updatecomponent,

...)

...}

class

watcher

}

在mount時會建立乙個watcher類,這個類是鏈結dep與vue元件的橋梁。每乙個watcher對應乙個vue component。

在new watcher()時會呼叫元件的getter方法,此時會呼叫render重新渲染函式。

render函式會訪問data屬性,這時就去呼叫這個屬性的getter函式

// getter函式

get:

function

reactivegetter()

,// dep的depend函式

depend()

}

在depend函式中,dep就是watcher物件本身。這樣每次渲染這個元件時,如果用到了這個屬性,元件對應的watcher都會註冊到這個屬性的dep中。這個過程被稱為依賴收集。

在收集完所有的依賴後,如果這個屬性變化,就會通知watcher去更新相關的元件。

3、更新階段

屬性改變時,回去呼叫dep裡面的notify函式,然後通知所有的watcher去呼叫update函式進行更新。

notify()

}

4、流程展示reactive屬性

setter

depnotify

watcher

re-render

vuecomponent

5、總結一下

第一步:元件初始化時給data中所有屬性新增get、set,reactive化;然後註冊乙個watcher物件,此時watcher會立即呼叫元件裡的render去生成虛擬dom,此時會用到data,所以會觸發getter函式,將當前的watcher註冊到sub裡。

第二步:在data屬性變化時,會遍歷sub中所有watcher物件,通知它們去渲染元件。

借鑑文章:

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