摘要:依賴收集是在響應(yīng)式基礎(chǔ)上進行的,不熟悉的同學可以先了解響應(yīng)式原理。定義一個依賴收集類。訂閱者,當依賴收集的時候回到中,在修改中數(shù)據(jù)的時候會觸發(fā)的,從而回調(diào)渲染函數(shù)。
寫在前面
因為對Vue.js很感興趣,而且平時工作的技術(shù)棧也是Vue.js,這幾個月花了些時間研究學習了一下Vue.js源碼,并做了總結(jié)與輸出。
文章的原地址:https://github.com/answershuto/learnVue。
在學習過程中,為Vue加上了中文的注釋https://github.com/answershuto/learnVue/tree/master/vue-src,希望可以對其他想學習Vue源碼的小伙伴有所幫助。
可能會有理解存在偏差的地方,歡迎提issue指出,共同學習,共同進步。
依賴收集是在響應(yīng)式基礎(chǔ)上進行的,不熟悉的同學可以先了解《響應(yīng)式原理》。
為什么要依賴收集先看下面這段代碼
new Vue({ template: `text1: {{text1}} text2: {{text2}}`, data: { text1: "text1", text2: "text2", text3: "text3" } });按照之前《響應(yīng)式原理》中的方法進行綁定則會出現(xiàn)一個問題——text3在實際模板中并沒有被用到,然而當text3的數(shù)據(jù)被修改的時候(this.text3 = "test")的時候,同樣會觸發(fā)text3的setter導致重新執(zhí)行渲染,這顯然不正確。
先說說Dep當對data上的對象進行修改值的時候會觸發(fā)它的setter,那么取值的時候自然就會觸發(fā)getter事件,所以我們只要在最開始進行一次render,那么所有被渲染所依賴的data中的數(shù)據(jù)就會被getter收集到Dep的subs中去。在對data中的數(shù)據(jù)進行修改的時候setter只會觸發(fā)Dep的subs的函數(shù)。
定義一個依賴收集類Dep。
class Dep () { constructor () { this.subs = []; } addSub (sub: Watcher) { this.subs.push(sub) } removeSub (sub: Watcher) { remove(this.subs, sub) } notify () { // stabilize the subscriber list first const subs = this.subs.slice() for (let i = 0, l = subs.length; i < l; i++) { subs[i].update() } } }Watcher訂閱者,當依賴收集的時候回addSub到sub中,在修改data中數(shù)據(jù)的時候會觸發(fā)Watcher的notify,從而回調(diào)渲染函數(shù)。
class Watcher () { constructor (vm, expOrFn, cb, options) { this.cb = cb; this.vm = vm; /*在這里將觀察者本身賦值給全局的target,只有被target標記過的才會進行依賴收集*/ Dep.target = this; /*觸發(fā)渲染操作進行依賴收集*/ this.cb.call(this.vm); } update () { this.cb.call(this.vm); } }開始依賴收集class Vue { constructor(options) { this._data = options.data; observer(this._data, options.render); let watcher = new Watcher(this, ); } } function defineReactive (obj, key, val, cb) { /*在閉包內(nèi)存儲一個Dep對象*/ const dep = new Dep(); Object.defineProperty(obj, key, { enumerable: true, configurable: true, get: ()=>{ if (Dep.target) { /*Watcher對象存在全局的Dep.target中*/ dep.addSub(Dep.target); } }, set:newVal=> { /*只有之前addSub中的函數(shù)才會觸發(fā)*/ dep.notify(); } }) } Dep.target = null;將觀察者Watcher實例賦值給全局的Dep.target,然后觸發(fā)render操作只有被Dep.target標記過的才會進行依賴收集。有Dep.target的對象會講Watcher的實例push到subs中,在對象被修改出發(fā)setter操作的時候dep會調(diào)用subs中的Watcher實例的update方法進行渲染。
關(guān)于作者:染陌
Email:answershuto@gmail.com or answershuto@126.com
Github: https://github.com/answershuto
Blog:http://answershuto.github.io/
知乎專欄:https://zhuanlan.zhihu.com/ranmo
掘金: https://juejin.im/user/58f87ae844d9040069ca7507
osChina:https://my.oschina.net/u/3161824/blog
轉(zhuǎn)載請注明出處,謝謝。
歡迎關(guān)注我的公眾號
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/84987.html
相關(guān)文章
深入淺出Vue響應(yīng)式原理
摘要:總結(jié)最后我們依照下圖參考深入淺出,再來回顧下整個過程在后,會調(diào)用函數(shù)進行初始化,也就是過程,在這個過程通過轉(zhuǎn)換成了的形式,來對數(shù)據(jù)追蹤變化,當被設(shè)置的對象被讀取的時候會執(zhí)行函數(shù),而在當被賦值的時候會執(zhí)行函數(shù)。 前言 Vue 最獨特的特性之一,是其非侵入性的響應(yīng)式系統(tǒng)。數(shù)據(jù)模型僅僅是普通的 JavaScript 對象。而當你修改它們時,視圖會進行更新。這使得狀態(tài)管理非常簡單直接,不過理解...
vue.js源碼 - 剖析observer,dep,watch三者關(guān)系 如何具體的實現(xiàn)數(shù)據(jù)雙向綁定
摘要:雙向數(shù)據(jù)綁定的核心和基礎(chǔ)是其內(nèi)部真正參與數(shù)據(jù)雙向綁定流程的主要有和基于和發(fā)布者訂閱者模式,最終實現(xiàn)數(shù)據(jù)的雙向綁定。在這里把雙向數(shù)據(jù)綁定分為兩個流程收集依賴流程依賴收集會經(jīng)過以上流程,最終數(shù)組中存放列表,數(shù)組中存放列表。 Vue雙向數(shù)據(jù)綁定的核心和基礎(chǔ)api是Object.defineProperty,其內(nèi)部真正參與數(shù)據(jù)雙向綁定流程的主要有Obderver、Dep和Watcher,基于d...
從Vue.js源碼角度再看數(shù)據(jù)綁定
摘要:在學習過程中,為加上了中文的注釋,希望可以對其他想學習源碼的小伙伴有所幫助。數(shù)據(jù)綁定原理前面已經(jīng)講過數(shù)據(jù)綁定的原理了,現(xiàn)在從源碼來看一下數(shù)據(jù)綁定在中是如何實現(xiàn)的。 寫在前面 因為對Vue.js很感興趣,而且平時工作的技術(shù)棧也是Vue.js,這幾個月花了些時間研究學習了一下Vue.js源碼,并做了總結(jié)與輸出。文章的原地址:https://github.com/answershuto/le...
Vue源碼解析(2)-vue雙向數(shù)據(jù)綁定原理
摘要:與狀態(tài)同步非常困難通過添加觀察者監(jiān)測變化,如和。應(yīng)用中狀態(tài)的屬性會被監(jiān)測,當它們發(fā)生變化時,只有依賴了發(fā)生變化屬性的元素會被重新渲染。 現(xiàn)代 js 框架存在的根本原因 然而通常人們(自以為)使用框架是因為:它們支持組件化;它們有強大的社區(qū)支持;它們有很多(基于框架的)第三方庫來解決問題;它們有很多(很好的)第三方組件;它們有瀏覽器擴展工具來幫助調(diào)試;它們適合做單頁應(yīng)用。 Keeping...
Vue2 源碼分析
摘要:應(yīng)用啟動一般是通過,所以,先從該構(gòu)造函數(shù)著手。構(gòu)造函數(shù)文件該文件只是構(gòu)造函數(shù),原型對象的聲明分散在當前目錄的多個文件中構(gòu)造函數(shù)接收參數(shù),然后調(diào)用。 源碼版本:v2.1.10 分析目標 通過閱讀源碼,對 Vue2 的基礎(chǔ)運行機制有所了解,主要是: Vue2 中數(shù)據(jù)綁定的實現(xiàn)方式 Vue2 中對 Virtual DOM 機制的使用方式 源碼初見 項目構(gòu)建配置文件為 build/conf...
發(fā)表評論
0條評論
閱讀 2327·2021-09-22 15:25
閱讀 3659·2019-08-30 12:48
閱讀 2281·2019-08-30 11:25
閱讀 2393·2019-08-30 11:05
閱讀 791·2019-08-29 17:28
閱讀 3332·2019-08-26 12:16
閱讀 2659·2019-08-26 11:31
閱讀 1844·2019-08-23 17:08