vue2響應(yīng)式原理總結(jié)

響應(yīng)式原理

  1. Observer
  2. Dep
  3. Watcher
  4. 遍歷整個組件樹

vue組件實例化時件蚕,會對data屬性深度遍歷(遇到數(shù)組或者對象)為每一個屬性添加數(shù)據(jù)劫持。數(shù)據(jù)劫持就是使用Object.defineProperty(de fai in pro pu tei)方法添加get/set方法芭毙。
在這個過程中會實例化一個Dep類萎馅。
1.在get攔截器里觸發(fā)dep實例的depend方法,進(jìn)行依賴收集拳锚,實質(zhì)是在dep的實例屬性sub數(shù)組中添加依賴這個屬性的watcher實例熄浓。
2.在set攔截器里觸發(fā)dep實例的notify方法,對收集到的所有依賴派發(fā)更新年鸳,(watcher的update方法)

vue組件實例化時會實例化一個渲染watcher,渲染watcher實例化過程會做兩件事情剃氧。
1.創(chuàng)建vnode,在這個過程中,訪問了data屬性阻星,觸發(fā)了get方法,完成了依賴收集已添。
2.觸發(fā)了子組件的實例化妥箕,子組件實例化又會重復(fù)上述數(shù)據(jù)劫持的過程。
這個過程就是對組件樹的深度遍歷更舞。

結(jié)合組件生命周期來看整個過程畦幢,父組件會先觸發(fā)created鉤子,子組件后觸發(fā)created鉤子缆蝉。而子組件mouted鉤子會先執(zhí)行宇葱,父組件的mouted鉤子后執(zhí)行。

Vue-Router

分步驟記憶
1刊头、實現(xiàn)頁面不刷新的原理
2黍瞧、頁面視圖刷新的原理

實現(xiàn)頁面不刷新
1.hash
2.history
3.abstract:支持所有 JavaScript 運行環(huán)境,如 Node.js 服務(wù)器端原杂。如果發(fā)現(xiàn)沒有瀏覽器的 API印颤,路由會自動強制進(jìn)入這個模式。

1.hash(哈希模式)穿肄,#符號后邊是瀏覽器行為年局,在改變的時候不對頁面進(jìn)行刷新(重新請求URL)(監(jiān)聽hashChange事件)
2.history模式,H5新增了pushState咸产,replaceState連個新API,可以修改歷史記錄卻不會使瀏覽器刷新頁面矢否。

視圖更新原理
其原理就是vue的響應(yīng)式更新dom的原理,m => v
m是數(shù)據(jù)脑溢,也就是在vue-router install時在根組件(root vue component)添加了_route屬性僵朗,在匹配到對應(yīng)路由后更新了_route屬性值,繼而觸發(fā)了該屬性值的渲染watcher,在繼而觸發(fā)dom更新。

兩種模式的不同
1.部署時衣迷,history模式需要服務(wù)端處理所有可能的路徑(例如配置nginx的配置文件)畏鼓,防止出現(xiàn)404。哈希模式則不需要壶谒。
2.URL表示不同云矫。

v-model 雙向綁定

v-model指令就是v-bind:value@input的語法糖。
它即可以支持原生表單元素汗菜,也可以支持自定義組件
在自定義組件中其實際是這樣的:

let vm = new Vue({
  el: '#app',
  template: '<div>' +
  '<child :value="message" @input="message=arguments[0]"></child>' +
  '<p>Message is: {{ message }}</p>' +
  '</div>',
  data() {
    return {
      message: ''
    }
  },
  components: {
    Child
  }
})

keep-alive

它的實現(xiàn)通過自定義render函數(shù), 緩存了 vnode

異步更新隊列 和 $nextTick用法

Vue 在更新 DOM 時是異步執(zhí)行的让禀,只要偵聽到數(shù)據(jù)變化,Vue 將開啟一個隊列陨界,并緩沖在同一事件循環(huán)中發(fā)生的所有數(shù)據(jù)變更巡揍。

如果同一個 watcher 被多次觸發(fā),只會被推入到隊列中一次菌瘪。在緩沖時會去除重復(fù)數(shù)據(jù)避免不必要的計算和 DOM 操作腮敌。

$nextTick(cb) 目的是在DOM 更新完成后傳入的回調(diào)函數(shù)再被調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俏扩,一起剝皮案震驚了整個濱河市糜工,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌录淡,老刑警劉巖捌木,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嫉戚,居然都是意外死亡刨裆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門彬檀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帆啃,“玉大人,你說我怎么就攤上這事窍帝×赐撸” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵盯桦,是天一觀的道長慈俯。 經(jīng)常有香客問我,道長拥峦,這世上最難降的妖魔是什么贴膘? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮略号,結(jié)果婚禮上刑峡,老公的妹妹穿的比我還像新娘洋闽。我一直安慰自己,他們只是感情好突梦,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布诫舅。 她就那樣靜靜地躺著,像睡著了一般宫患。 火紅的嫁衣襯著肌膚如雪刊懈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天娃闲,我揣著相機(jī)與錄音虚汛,去河邊找鬼。 笑死皇帮,一個胖子當(dāng)著我的面吹牛卷哩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播属拾,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼将谊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渐白?” 一聲冷哼從身側(cè)響起瓢娜,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎礼预,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虏劲,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡托酸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柒巫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片励堡。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堡掏,靈堂內(nèi)的尸體忽然破棺而出应结,到底是詐尸還是另有隱情,我是刑警寧澤泉唁,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布鹅龄,位于F島的核電站,受9級特大地震影響亭畜,放射性物質(zhì)發(fā)生泄漏扮休。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一拴鸵、第九天 我趴在偏房一處隱蔽的房頂上張望玷坠。 院中可真熱鬧蜗搔,春花似錦、人聲如沸八堡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兄渺。三九已至缝龄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間溶耘,已是汗流浹背二拐。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留凳兵,地道東北人百新。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像庐扫,于是被迫代替她去往敵國和親饭望。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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