Vue響應式原理

2021-10-10 14:16:22 字數 3041 閱讀 4698

vue 2.x

vue 3.x

發布訂閱模式

vue 的自定義事件

模擬 vue 自定義事件的實現

// 事件觸發器

class eventemitter

this.subs = object.create(null)

} // 註冊事件

$on (eventtype, handler)

// 觸發事件

$emit (eventtype) )}}}

// 測試

let em = new eventemitter()

em.$on('click', () => )

em.$on('click', () => )

em.$emit('click')

觀察者模式目標(發布者) – dep

沒有事件中心

// 發布者-目標

class dep

// 新增訂閱者

addsub (sub)

}// 發布通知

notify () )

}} // 訂閱者-觀察者

class watcher

} // 測試

let dep = new dep()

let watcher = new watcher()

dep.addsub(watcher)

dep.notify()

總結observer

compiler

dep

watcher

vue

**

class vue

this.$data = options.data

this.$el = typeof options.el === 'string' ? document.queryselector(options.el) : options.el,

// 2. 把data中的成員轉換成getter和setter,注入到vue例項中

this._proxydata(this.$data)

// 3. 呼叫observer物件,監聽資料的變化

new observer(this.$data)

// 4. 呼叫compiler物件,解析指令和差值表示式

new compiler(this)

} initmethods(vm, methods)

} _proxydata(data),

set(newvalue)

})})

}}

observer**

class observer

walk(data))

} definereactive(obj, key, val),

set(newvalue)

})}}

compiler**

class compiler

// 編譯模板,處理文字節點和元素節點

compile(el)else if(this.iselementnode(node))

// 判斷當前節點下是否有子節點,有子節點時遞迴遍歷compile

if(node.childnodes && node.childnodes.length)

})} // 編譯文字節點

compiletext(node)\}/

let value = node.textcontent

if(reg.test(value))

} // 編譯元素節點,處理指令

compileelement(node)else if(this.isdirective(attrname))

}) } addhandler(el, handlename, handle)

update(node, key, attrname)

// 處理 v-text 指令

textupdater(node, value, key))

} // 處理 v-model 指令

modelupdater(node, value, key))

// 雙向繫結

node.addeventlistener('input', () => )

} // 處理 v-html 指令

htmlupdater(node, value, key))

} // 判斷元素屬性是否是指令

isdirective (attrname)

//判斷是否為文字節點

istextnode(node)

//判斷是否為元素節點

iselementnode(node)

}

dep(dependency)**

class dep

// 新增觀察者

addsub(sub)

} // 傳送通知

// 當資料發生變化的時候更新檢視

update()

}

總結observer

新增 dep 和 watcher 的依賴關係

資料變化傳送通知

compiler

depwatcher

參考

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