手寫Vue2 0響應式原理

2022-06-20 19:12:13 字數 1115 閱讀 8850

今天來實現乙個簡易版的vue2.0響應式

class vue 

})// 響應化

this.observe(this.$data)

// 測試**

// new watcher(this, 'test')

// this.test

// 建立編譯器

// new compile(options.el, this)

if (options.created)

}// 遞迴遍歷,使傳遞進來的物件響應化

observe(value)

if (array.isarray(value))

object.keys(value).foreach(key => )

}// 在vue根上定義屬性**data中的資料,這樣就能通過 this 呼叫資料

proxydata(key) ,

set(newval) })}

definereactive(obj, key, val) ,

set(newval) 屬性更新了`)

dep.notify() // 通知檢視更新}}

})}

}// dep: 管理若干watcher例項,它和key一對一關係

class dep

adddep(watcher)

notify()

}// 實現update函式可以更新

class watcher

update() 屬性更新了`)

this.cb.call(this.vm, this.vm[this.key])

}}

這樣就實現了乙個簡易版的vue,vue2.0有兩個比較明顯的問題:

需要注意的是object.defineproperty的缺點是不能**陣列,所以我們需要對陣列的方法進行重寫,詳細部分請重新看上面的**,這部分是面試要考的重點。

vue2.0還有乙個比較明顯的缺點就是,物件上不存在的屬性,不能被**,因為從上面的**,我們能看出observe遍歷的是物件上已經有的屬性,所以沒有的屬性就不會被**,我們就必須通過呼叫$set()方法去將新加的屬性響應式,這個缺點會在vue3.0中彌補,有興趣的同學可以看看vue3.0的原始碼。

Vue2 0響應式原理

最近vue3.0響應式原理引起前端陣陣狂熱,所以我也下定決心將vue的響應式原理總結一下。我們都知道vue2.0的響應式原理使用的乙個核心api是object.defineproperty.為我們要觀察的資料設定getter和setter方法。我們可以看到如果響應式的資料多的時候,我們需要迴圈遍歷d...

vue2 0響應式原理的應用

監測屬性的變化 function observe target 對物件中的每乙個屬性進行監視 for let key in target function definereactive target,key,value set newval function updateview let data ...

Vue 2 0中的響應式原理實現

主要原理 使用object.defineproperty方法給物件的每乙個屬性註冊 get 和set方法,在set方法中執行render方法進行頁面重新渲染 let obj 定義響應式,此方法用來對某一物件進行註冊set和get方法操作 let definereactive obj,key,valu...