Vue.js 源碼分析(三十二) 總結

来源:https://www.cnblogs.com/greatdesert/archive/2019/08/05/11300263.html
-Advertisement-
Play Games

第一次寫博客,堅持了一個多月時間,Vue源碼分析基本分析完了,回過頭也看也漏了一些地方,比如雙向綁定里的觀察者模式,也可以說是訂閱者模式,也就是Vue里的Dep、Watcher等這些函數的作用,網上搜一下講解也挺多的,這些知識點也是很重要的,對於閱讀源碼的同學這一塊務必要花點時間學一下 還有一個挺重 ...


第一次寫博客,堅持了一個多月時間,Vue源碼分析基本分析完了,回過頭也看也漏了一些地方,比如雙向綁定里的觀察者模式,也可以說是訂閱者模式,也就是Vue里的Dep、Watcher等這些函數的作用,網上搜一下講解也挺多的,這些知識點也是很重要的,對於閱讀源碼的同學這一塊務必要花點時間學一下

還有一個挺重要是Vue的一個use和mixin方法,這兩個方法用於Vue插件的註冊,比如Vuex、Vuex-router等等都是通過Vue.use()來註冊的,註冊完後會執行對應插件的install方法進行安裝,例如對於Vuex來說:

if (version >= 2) {
  Vue.mixin({ beforeCreate: vuexInit });     //對於Vuex來說,通過mixin混入,在Vue的beforeCreate生命周期函數內插入一個vuexInit方法
} else {
  // override init and inject vuex init procedure
  // for 1.x backwards compatibility.
  var _init = Vue.prototype._init;
  Vue.prototype._init = function (options) {
    if ( options === void 0 ) options = {};

    options.init = options.init
      ? [vuexInit].concat(options.init)
      : vuexInit;
    _init.call(this, options);
  };
}

對於Vue-router來說,如下:

Vue.mixin({                             //對於Vue-router來說,通過mixin混入,在Vue的beforeCreate和destroyed生命周期函數內分別插入兩個函數體
  beforeCreate: function beforeCreate () {
    if (isDef(this.$options.router)) {
      this._routerRoot = this;
      this._router = this.$options.router;
      this._router.init(this);
      Vue.util.defineReactive(this, '_route', this._router.history.current);
    } else {
      this._routerRoot = (this.$parent && this.$parent._routerRoot) || this;
    }
    registerInstance(this, this);
  },
  destroyed: function destroyed () {
    registerInstance(this);
  }
});

當我們執行Vue.use(Vuex)或者Vue.use(Router)安裝Vuex或Vue-router插件時,就會執行Vue內部的use函數介面,如下:

  Vue.use = function (plugin) {       //第4728行   註冊插件用
    var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));     //獲取當前Vue已經註冊的插件列表
    if (installedPlugins.indexOf(plugin) > -1) {                                          //如果plugin插件已經註冊過了
      return this                                                                           //直接返回,不做處理
    }

    // additional parameters
    var args = toArray(arguments, 1);                 //去掉第一個參數
    args.unshift(this);                               //然後將大Vue放進去
    if (typeof plugin.install === 'function') {       //如果有該插件有install方法
      plugin.install.apply(plugin, args);               //執行該install方法,參數為args(第一個參數為大Vue的實例)
    } else if (typeof plugin === 'function') {
      plugin.apply(null, args);
    }
    installedPlugins.push(plugin);                    //將插件plugin保存到installedPlugins裡面,避免多次執行Use時重覆安裝
    return this
  };

也就是說執行插件的install函數時,函數內的上下文為Vue實例,然後就可以在Vue內部的生命周期內執行各種操作了,這就是插件的邏輯了。

mixin就是混入的意思,也就是把對象里的信息保存到Vue實例的options上,一般是混入一些生命周期函數,源碼就一行,保存到Vue實例的options上,我就不貼了。

從整體來看,Vue只是一個匿名函數,該函數會在window.Vue這個屬性上掛載一個函數,然後在該函數本身或函數原型上定義一些屬性、操作如此而已,只是Vue定義的屬性和操作比多,看起來複雜,例如Vue有一萬多行代碼,不只是Vue,大多話前端框架基本都是這個設計模式吧(通過執行一個匿名函數來給window掛載一個屬性作為調用的介面)。

理解源碼有一個好處就是用起來真的很爽,比如我現在工作用到Vue時就和算算術題1+1=2一樣,而且寫起代碼來沒有冗餘代碼,因為你知掉它是怎麼實現的了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇中,簡單的說明瞭下 count() 與 sum() 的區別,雖然count 函數是彙總行數的,不過我彙總行數的時候經常是使用SUM(1) ,那麼問題來了,count(1) 與 sum(1) 那個更快? 讓我們比較SUM和COUNT的性能:示例使用的是SQl server 官方示例資料庫 下麵是 ...
  • 1、 truncate 表報 ORA-00054 ,標明有事務正在操作該表 SQL> truncate table alldm.DM_XQKD_YUJING_D;truncate table alldm.DM_XQKD_YUJING_D*ERROR at line 1:ORA-00054: reso ...
  • 過期策略: 我們在set key時,可以給一個expire time,就是過期時間 這段過期時間以後,redis對key刪除使用:定期刪除+惰性刪除 定期刪除指redis預設在100ms內隨機抽取一些設置了過期時間的key,檢查是否過期,過期就刪除。 定期刪除因為隨機的,很多key沒有刪除,就用到惰 ...
  • 爬蟲數據去重: 使用MD5生成指紋判斷頁面是否變化 數據存入mongodb,對關鍵字進行複合索引(千萬以下) 對數據關鍵字進行哈希映射,生成指紋判斷是否在redis的指紋集合中,並可通過是否過濾判斷request對象是否進隊,對request對象進行過濾(千萬級別) 布隆過濾器,實現大數據去重(億級 ...
  • Cassandra簡介 Cassandra是一個開源分散式NoSQL資料庫系統。 它最初由Facebook開發,用於儲存收件箱等簡單格式數據,集GoogleBigTable的數據模型與Amazon Dynamo的完全分散式的架構於一身。Facebook於2008將 Cassandra 開源,此後,由 ...
  • 我們平時的測試過程中有一個環節就是準備測試數據,包括準備基礎數據,準備業務數據,使用的場景包括壓力測試,後臺批量數據傳輸,前端大數據查詢導出,或者分頁列印等功能,準備測試數據我們通俗點講就是造數據,根據不同的使用場景我們有不同的造數據的方式,比如需要大數據時我們可以用jmeter壓測獲取大數據,也可 ...
  • 項目 & 任務 Gradle 的一切都是基於項目和任務的。 構建由一個或多個項目組成。項目的概念很抽象,它取決於你要用Gradle 做什麼 。項目可以是 一個 Jar 庫或者一個 web 程式。也可以是一個 zip 壓縮包,也可以是將項目部署到生產環境等等; 一個項目是由一個或多個任務組成的;任務是 ...
  • 零基礎前端開發工程師視頻教程全套,基礎+進階+項目實戰(共120G) 下載地址 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...