1. 程式人生 > >【Vue原理】依賴更新

【Vue原理】依賴更新

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧

【Vue原理】依賴更新 - 原始碼版

如果對依賴收集完全沒有概念的同學,可以先看我這篇白話版

響應式原理 - 白話版

我們已經講過了 依賴收集

【Vue原理】依賴收集 - 原始碼版之基本資料型別

【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 在第一篇講過了

【Vue原理】依賴收集 - 原始碼版之基本資料型別

我們知道,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