稍微簡單了解一下Vue的響應(yīng)式原理

???????最近在玩React瓜富,寫了幾個demo驚醒自己其實對vue的了解還是半斤八兩鳍咱,主要還是在公司總是寫業(yè)務(wù)代碼不咋注重底層(哎,不想加班QAQ)与柑,趁此機會重新過一遍vue文檔想要稍微了解一下vue雙向綁定的原理和簡單實現(xiàn)方案谤辜。
???????首先我們先說說傳統(tǒng)的MVC模式,MVC指的是Model-View-Controller价捧。MVC模式是單向數(shù)據(jù)綁定丑念,就是將Model中的數(shù)據(jù)綁定到View(顯示層)上,在執(zhí)行Controller去修改Model中的數(shù)據(jù)后结蟋,Model會再次通知View去改變渠欺。這是一個單向循環(huán)的數(shù)據(jù)綁定操作。然而Vue不是采用MVC模式椎眯,他使用的是MVVM模式,MVVM指Model-View-ViewModel模式胳岂。MVVM是將Model中的數(shù)據(jù)綁定到ViewModel中编整,Model層的變化會通知ViewModel使其更新View層,反過來View層的變化也會通知ViewModel使其更新Model層乳丰。因此雙向綁定我便可以理解為model的數(shù)據(jù)更新能使得View層的更新掌测,并且用戶更新View層也會導(dǎo)致Model層的數(shù)據(jù)自動更新。
???????我們在網(wǎng)上隨便搜vue 雙向綁定产园,大部分搜出的結(jié)果都會說這么一句話:vue數(shù)據(jù)雙向綁定是通過數(shù)據(jù)劫持結(jié)合發(fā)布-訂閱模式的方式來實現(xiàn)的汞斧。當初我看這句話的時候真的是完全無法理解其中含義,過了一段時間以后我再回頭看其他資料結(jié)合官方文檔的解釋才能理解(我太笨了 QAQ)什燕。接下來我就簡單的描述一下Vue的雙向綁定原理粘勒。
???????按照Vue官方文檔中的描述,我們將JS對象傳入Vue實例作為data選項屎即,Vue會遍歷這個對象的所有屬性并使用Object.defineProperty()庙睡,將對象中的各個屬性轉(zhuǎn)化為getter和setter事富。vue定義了getter和setter并在其中設(shè)置了更新dom的方法,當對象中的這個屬性被調(diào)用或修改時(即get/set時)乘陪,vue會在屬性變化的同時執(zhí)行更新DOM的方法统台,這樣就可以及時更新在頁面上。(原理如下啡邑,Object.defineProperty()這個API大家可以去MDN了解一下)

Object.defineProperty(data, '我要修改這個屬性的getter和setter', {
  get: function(){
    console.log('get返回值之前我先做點事情')
    /*
     * 這里是通知變化代碼
     */
    return value
  },
  set: function(newValue){
    value = newValue
    console.log('set設(shè)置好以后我再做點事情')
    /*
     * 這里是通知更新代碼
     */
  }
})

下面根據(jù)官方文檔簡單描述一下vue的雙向綁定是如何實現(xiàn)的:


官方文檔的雙向綁定圖片實例

???????vue中每個組件實例都對應(yīng)一個 watcher 實例贱勃,現(xiàn)在我們把目光聚焦在上圖的紫色圓中。紫色圓代表Data谤逼,組件初始化就會修改Data中每個屬性的getter和setter函數(shù)贵扰。當組件中某個屬性被get時,getter會同時通知Watcher實例森缠,讓W(xué)atcher拿個小本子記一下我這里有這么個屬性拔鹰;setter也類似,當屬性被修改執(zhí)行set時贵涵,setter也會通知watcher列肢。watcher收到通知后會檢查被改動的屬性是否記錄在小本子上并檢查是否有變動,在且有變化的情況下就繼續(xù)往下通知組件渲染函數(shù)讓它去更新虛擬DOM樹宾茂。(暫時想不到更形象的比喻了 - -)


后面我又去找了找原生JS如何實現(xiàn)vue的雙向綁定瓷马,找到一個文章寫的很棒,現(xiàn)在先在這里記錄一下這個文章:雙向綁定實現(xiàn)過程跨晴。由于我的理解還沒那么深入欧聘,暫時不寫實現(xiàn)過程了,根據(jù)前面那個文章的描述我也試著寫了一下端盆,下面是我寫的代碼地址怀骤。

感謝觀看,如有錯誤麻煩在評論指出焕妙,謝謝~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒋伦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子焚鹊,更是在濱河造成了極大的恐慌痕届,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件末患,死亡現(xiàn)場離奇詭異研叫,居然都是意外死亡,警方通過查閱死者的電腦和手機璧针,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門嚷炉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陈莽,你說我怎么就攤上這事渤昌∷涑” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵独柑,是天一觀的道長迈窟。 經(jīng)常有香客問我,道長忌栅,這世上最難降的妖魔是什么车酣? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮索绪,結(jié)果婚禮上湖员,老公的妹妹穿的比我還像新娘。我一直安慰自己瑞驱,他們只是感情好娘摔,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唤反,像睡著了一般凳寺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上彤侍,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天肠缨,我揣著相機與錄音,去河邊找鬼盏阶。 笑死晒奕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的名斟。 我是一名探鬼主播脑慧,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砰盐!你這毒婦竟也來了漾橙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤楞卡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后脾歇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒋腮,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年藕各,在試婚紗的時候發(fā)現(xiàn)自己被綠了池摧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡激况,死狀恐怖作彤,靈堂內(nèi)的尸體忽然破棺而出膘魄,到底是詐尸還是另有隱情,我是刑警寧澤竭讳,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布创葡,位于F島的核電站,受9級特大地震影響绢慢,放射性物質(zhì)發(fā)生泄漏灿渴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一胰舆、第九天 我趴在偏房一處隱蔽的房頂上張望骚露。 院中可真熱鬧,春花似錦缚窿、人聲如沸棘幸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽误续。三九已至,卻和暖如春光绕,著一層夾襖步出監(jiān)牢的瞬間女嘲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工诞帐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欣尼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓停蕉,卻偏偏與公主長得像愕鼓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子慧起,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容