【Vue原理】依賴更新
如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧
如果對依賴收集完全沒有概念的同學,可以先看我這篇白話版
我們已經講過了 依賴收集
現在就要看依賴更新了哈哈哈,畢竟收集完是要更新的嘛
其實依賴更新挺簡單的,就是兩步
修改屬性值 通知儲存的依賴進行更新 重點只需要看 Object.defineProperty 設定的set 函式,當給資料重賦新值的時候,自然會觸發 set 函式,完成依賴更新
function defineReactive(obj, key, val) { var dep = new Dep(); var childOb = observe(val); Object.defineProperty(obj, key, { get(){ ... 屬性被讀取,完成依賴收集 // 返回閉包值 return val }, set(newVal) { // 值沒有變化 if (newVal ===val) return // 修改閉包值 val = newVal; // 如果屬性已經存在過,設定新值的時候,會重新呼叫一遍 childOb = observe(newVal); // 觸發更新 dep.notify(); } }); }
依賴更新重點就重在 通知更新
而通知更新的重點,只有一句話,【dep.notify】
所以,我們重點去了解這句話,如何通知,如何更新
好的, dep 在第一篇講過了
我們知道,dep 主要是儲存依賴的,再看一遍原始碼
var Dep = function Dep() { this.subs = []; // 依賴儲存器 }; // 遍歷 subs ,逐個通知依賴,就是逐個呼叫 watcher.update Dep.prototype.notify = function() { var subs = this.subs.slice(); for (var i = 0, l = subs.length; i < l; i++) { subs[i].update(); } };
看過了原始碼,我們知道了,原來通知更新是【遍歷依賴儲存器】,然後一個個【呼叫 watcher.update】
因為 subs 裝的是 watcher,所以,subs[0].update 就是 watcher.update
於是問題又來了,watcher.update 是怎麼就更新了???
function Watcher(vm, expOrFn) {
this.vm = vm;
// 儲存傳入的更新函式
this.getter = expOrFn;
// 新建 watcher 的時候,立即執行更新函式
this.get();
};
Watcher.prototype.get = function() {
// 執行更新函式
this.getter.call(this.vm,this.vm);
};
Watcher.prototype.update = function() {
this.get()
}
看到上面的原始碼
1Watcher 新建例項的時候,會儲存傳入的函式(這個函式會作為更新用)
2watcher 例項有 update 方法,作用是執行上一步儲存的更新函式
那麼 watcher 是什麼時候開始建立的呢?
以頁面 watcher 舉例,探索整個例項構建的基本流程
function Vue(options) {
this._init(options);
}
Vue.prototype._init = function(options) {
// ...處理元件選項等
this.$mount()
}
Vue.prototype.$mount = function() {
// ...解析template成redner函式儲存
/** 每個例項新建一個watcher,
並且利用watcher 儲存更新函式 **/
new Watcher(this,
// 這個函式是更新函式,傳入watcher儲存下來,用於後面頁面初始化或者頁面更新
function() {
/** ...呼叫儲存的渲染函式生成VNode,
並生成DOM插入頁面中**/
}
);
};
看上面的原始碼 和註釋大概就可以很清楚了
從 【new Vue】 到 【vm._init】 初始化 到 【vm.$mount】 掛載到頁面,整個流程就完整了
重點是清楚 watcher的更新函式
更新函式
我們可以看到這個頁面的更新函式,作用是呼叫 渲染函式,然後生成DOM節點插入頁面中。
更新函式會傳入Watcher ,然後被儲存到 watcher 的例項中
“整個函式涉及的原始碼很多,但是這裡一律而過”
所以,通知更新做了這些工作
1、直接呼叫 watcher.update,也就是重新呼叫給 watcher 儲存的更新函式
2、更新更新函式就是執行渲染函式,然後讀取例項最新的值(已被修改過的值),最後重新生成DOM 節點
3、DOM 節點 插入或替換頁面,完成更新
畫個通知流程圖
相關推薦
【Vue原理】依賴更新
如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】依賴更新 - 原始碼版 如果對依賴收集完全沒有概念的同學,可以先看我這篇白話版 響應式原理 - 白話版 我們已經講過了 依賴收集 【Vue原理】依賴收集 - 原始碼版之基本資料型別 【Vue
【Vue原理】Watch
如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Watch - 原始碼版 今天繼續探索 Watch 原始碼,廢話不多說了 帶著我的幾個疑問開始 1、什麼時候初始化 2、怎麼確定監聽哪些值 3、深度監聽怎麼回事 4、怎麼觸發我的函式 這些問題的答案會摻
【Vue原理】Props
如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Props - 原始碼版 今天記錄 Props 原始碼流程,哎,這東西,就算是研究過了,也真是會隨著時間慢慢忘記的。 幸好我做了詳細的文章,忘記了什麼的,回憶起來必然是很快的。 好的,回到正題,Props 請你
【Vue原理】Mixins
如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Mixins - 原始碼版 今天探索的是 mixins 的原始碼,mixins 根據不同的選項型別會做不同的處理 篇幅會有些長,你知道的,有很多種選項型別的嘛,但不是很難。只是涉及原始碼難免會有些煩, 不過這篇文
【Vue原理】VNode
如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】VNode - 原始碼版 今天就來探索 VNode 的原始碼,VNode 是 Vue2 渲染機制中很重要的一部分,是深入Vue 必須瞭解的部分 我們以4個問題來開始我們的探索 1、vnode 是什麼及其作用
【Vue原理】Event
如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Event - 原始碼版 之 自定義事件 Vue 的自定義事件很簡單,就是使用 觀察者模式 進行事件的監聽和分發 Vue 封裝的這個觀察者模式,可以說是很完善了,這個可以獨立抽取出來的在其他專案中使用的程式碼,
【Vue原理】NextTick
寫文章不容易,點個讚唄兄弟 專注 Vue 原始碼分享,文章分為白話版和 原始碼版,白話版助於理解工作原理,原始碼版助於瞭解內部詳
【Vue原理】Render
寫文章不容易,點個讚唄兄弟 專注 Vue 原始碼分享,文章分為白話版和 原始碼版,白話版助於理解工作原理,原始碼版助於瞭解內部詳
【Vue原理】Diff
寫文章不容易,點個讚唄兄弟 <br> <br> 專注 Vue 原始碼分享,文章分為白話版和 原始碼版,
【maven問題】強制更新程式依賴的jar包 Force Update of Snapshots/Releases
同事更新了依賴的jar包,所以程式碼一直報錯。這個時候想當然的重新install, 結果卻因為程式中報錯而無法install… 呵呵, 我install就是為了解決報錯,結果你報錯告訴我不能install.. 豈不是無限死迴圈了?? 莫急 , 這個時候我們
【vue.js】入門
emp 寫到 logs 組件 images href one mooc 渲染 慕課網視頻學習筆記:http://www.imooc.com/learn/694 1.將html、js、css寫到一個後綴名.vue的文件中,區分這三種類型是通過<template>、
【設計思想】依賴註入
構造函數 magic clas 實例 reg 調整 emca sde sta 場景:傳統的思路是應用程序用到一個Foo類,就會創建Foo類並調用Foo類的方法,假如這個方法內需要一個Bar類,就會創建Bar類並調用Bar類的方法,而這個方法內需要一個Bim類,就會創建Bi
【底層原理】四位計算機的原理及其實現
一點 led燈 waiting lean div rm2 src and nvt 你是否想過,計算機為什麽會加減乘除?或者更直接一點,計算機的原理到底是什麽? Waitingforfriday有一篇詳細的教程,講解了如何自己動手,制作一臺四位計算機。從中可以看到,二進制、數
【計算機原理】程序執行過程
進程 cnblogs div 空間 時間片 chat 內存管理 tro alt 本章主要介紹程序執行過程中操作系統、CPU都幹了什麽 運行前 程序在運行前,只是在硬盤上待著,此時就是一堆二進制代碼而已,沒有任何作用。 程序只有進入了內存才能運行,但是要進入內存,則需要服從操
【計算機原理】CPU部分.md
工作 信號 通過 臃腫 流水線 處理 2.6 操作 ade 本文由CPU阿甘改編而得,主要講的是系統啟動和程序執行時CPU做的工作。 CPU的構成 中央處理器(CPU,Central Processing Unit)由運算器、控制器、Cache等。 控制器:主要是對指令進
【組成原理】第一章 計算機系統概述
表示 運算 傳遞 intro 指令 掌握 周期 style 主存 重點掌握:MAR和MDR的含義,主存容量大小、CPU執行時間的計算,性能指標CPI、MIPS、主頻等等。 1. 存儲單元:CPU訪問存儲器的基本單位,每個單元有一個地址。通常是字節大小的整數倍。 2. CPU
【編譯原理】c++實現自下而上語法分析器
不可 acm times style size PC -i 表達式 鏈接 寫在前面:本博客為本人原創,嚴禁任何形式的轉載!本博客只允許放在博客園(.cnblogs.com),如果您在其他網站看到這篇博文,請通過下面這個唯一的合法鏈接轉到原文! 本博客全網唯一合法URL:ht
【計數原理】【UVA11538】 Chess Queen
put typename return col nbsp 題意 putchar cst putc 傳送門 Description 給你一個n*m的棋盤,在棋盤上放置一黑一白兩個皇後,求兩個皇後能夠互相攻擊的方案個數 Input 多組數據,每組數據包括:
MongoDB 復制集 第 二 部 之【選舉原理】
command primary red and 優先權 mongo mongodb 主機 set 目錄: 1·復制與選舉的原理與驗證2·oplog 日誌調整3·配置復制集的優先級4·部署認證的復制5·總結 復制與選舉的原理: 上一篇文章搭建了多臺實例,部署成復制集,
Memcached 主主復制 + Keepalived 高可用架構【附上原理】
ima pki nag ali event 主服務器 figure tel outer 目錄: 1·Memcached 主主復制概念2·Memcached 高可用的實現3·案例部署4·總結 Memcached 主主復制概念 (1)主主復制概念: Memcached