Vue-Router 源碼解析(四) $router和$route的區別

来源:https://www.cnblogs.com/greatdesert/archive/2020/03/12/12458385.html
-Advertisement-
Play Games

對於Vue內部來說,不管是根組件還是子組件,都存在this.$router和this.$route兩個屬性,它們的區別如下: $router 指向當前的VueRouter實例,也就是new Vue({router:router})這裡傳入的router實例對象,可以使用上一節里列出的VueRoute ...


對於Vue內部來說,不管是根組件還是子組件,都存在this.$router和this.$route兩個屬性,它們的區別如下:

$router    指向當前的VueRouter實例,也就是new Vue({router:router})這裡傳入的router實例對象,可以使用上一節里列出的VueRouter實例的屬性和方法

$route       指向當前跳轉的路由對象,是一個包含當前的路由信息的對象,<router-view/>組件會通過這個屬性來獲取需要渲染的組件

對於$router來說,它包含瞭如下屬性

  • path            ;當前路由的路勁,總是解析為絕對路勁        ;例如:/foo/bar
  • params        ;對象類型,包含了動態片段和全匹配片段,如果沒有路由參數就是一個空對象
  • query            ;對象類型,表示URL查詢參數,對於/foo/user=1來說,$route.query.user等於1,如果沒有查詢參數,則是個空對象
  • hash            ;當前路由的hash值(帶#),如果沒有hash值,則為空字元串
  • fullPath        ;解析完成後的URL,包含查詢參數和hash的完整路勁
  • matched        ;一個數組,包含當前路由的所有嵌套路勁片段的路由記錄,也就是所有父路由對象都在這個數組裡面,<router-view/>組件會用到這個屬性
  • name            ;當前路由的名稱            ;和命名別名有關
  • redirectedFrom    ;重定向來源的路由的名字        ;和重定向及別名有關。
  • meta            ;meta值

name、meta這兩個值就是創建vuerouter時,傳入的router屬性對應的每條路由記錄的name和mata屬性,其它的一般經過一些處理

 writer by:大沙漠 QQ:22969969

舉個慄子:

    <div id="app">
        <router-link to="/login">登陸</router-link>
        <router-link to="/info/15">詳情頁</router-link>     
        <hr/>
        <router-view></router-view>
    </div>
    <script>
        const login = { template:'<div>Login Page!</div>'}                       
        const info  = { template:'<div>id:{{this.$route.params.id}}</div>'}
        const routes = [                                                       
            {path:'/login',component:login,name:'login'},
            {path:'/info/:id',component:info,name:'info'},
        ]
        const app = new Vue({                                                     
            el:'#app',
            router:new VueRouter({routes})
        })
    </script>

渲染如下:

我們點擊登陸路由到登陸頁面,控制台輸入app.$route,然後點擊詳情頁,控制台再輸入app.$route,列印分別如下:

Login頁面: Info頁面:

經常用到這個$route對象的地方就是在導航守衛里,參數2的to就是這個$route對象。

VueRouter安裝的時候會執行它的install方法,該方法如下:

Object.defineProperty(Vue.prototype, '$router', {                 //Vue實例的$router指向了this._routerRoot._router
    get: function get () { return this._routerRoot._router }
});

Object.defineProperty(Vue.prototype, '$route', {                 //設置$route為this.$root._route
    get: function get () { return this._routerRoot._route }
});

通過執行Object.defineProperty,我們在Vue內部訪問this.$router和this.$route都一直指向了this._routerRoot._router和this._routeRoot._route,而這兩個屬性是在VueRouter在安裝的時候混入到Vue的beforeCreate生命周期函數內實現的,如下:

beforeCreate: function beforeCreate () {
  if (isDef(this.$options.router)) {             //如果this.$options.router存在    ;就是在創建Vue實例時傳入的router對象
    this._routerRoot = this;                         //在Vue實例上添加一個_routerRoot指向自己,即Vue實例
    this._router = this.$options.router;             //在Vue實例上添加一個_router指向構造時的vue-router實例
    this._router.init(this);                         //vue-router實例調用init()進行初始化,參數為Vue實例
    Vue.util.defineReactive(this, '_route', this._router.history.current);         //通過Vue的defineReactive把_router變成響應式,等於this._router.history.current
  } else {
    this._routerRoot = (this.$parent && this.$parent._routerRoot) || this;
  }
  registerInstance(this, this);
},

this._router.history.current等於VueRouter實例.history.current屬性,在每次路由跳轉後都會執行History原型上的updateRoute方法,會在該方法內重置current屬性,路由對象的創建如下:

    function createRoute(record, location, redirectedFrom, router) {    //創建一個路由對象 record:路由記錄信息 location:需要跳轉的路由地址(包含path、query、hash和params的對象)  redirectedForm:未知 router:Vue-Router實例
        var stringifyQuery$$1 = router && router.options.stringifyQuery;

        var query = location.query || {};                                   //重置query,如果未設置則重置為空對象
        try {
            query = clone(query);
        } catch (e) {}

        var route = {                                                       //添加一個route對象
            name: location.name || (record && record.name),                     //name信息
            meta: (record && record.meta) || {},                                //meta信息
            path: location.path || '/',
            hash: location.hash || '',                                          //路由的路勁
            query: query,                                                       //路由的hash
            params: location.params || {},                                      //路由的params
            fullPath: getFullPath(location, stringifyQuery$$1),                 //完整路勁
            matched: record ? formatMatch(record) : []                          //記錄record 從當前到父節點一直到祖先節點的所有record
        };
        if (redirectedFrom) {
            route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery$$1);
        }
        return Object.freeze(route)                                         //最後將route對象凍結並返回(即不允許新增屬性)
    }

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

-Advertisement-
Play Games
更多相關文章
  • Node.js Net 模塊提供了一些用於底層的網路通信的小工具,包含了創建伺服器/客戶端的方法 server.js var net = require("net"); var server=net.createServer(function(connection){ console.log("客戶 ...
  • 廢話不多說,直接聊乾貨。 關鍵詞“零基礎”和“迅速”,針對這兩個詞,我們就應該相應的學習規劃。首先你是一個零基礎的人,現在急需把web前端相關技能學好,在“保證學習質量”的同時用最短的時間學好web前端應該掌握的必要技術。 具體實行方案如下: 1.瞭解web前端市場需求 首先,零基礎的人應該去瞭解目 ...
  • 今天來說說es6的語法,最基礎的也就是var,let,const 的用法與區別了,我們來看看他們之間的恩怨情仇。 首先來說說var,這個只要是學過js的都知道,它是用來聲明一個變數的,但是它在開發中也會遇到一些問題,比較難解決。先來看看下麵的代碼: var str="hello world"; ​ ...
  • 問題描述:在console.log中列印一個json對象時會顯示[object Object] //清空控制台輸出並將游標顯示在第一排 console.clear(); //定義一個json格式的對象 var j = {}; j.name = "小J"; j.sex = true; j.age = ...
  • 參考鏈接:https://blog.csdn.net/qq_20777797/article/details/77916029 https://www.xiabingbao.com/css3/2017/07/03/css3-infinite-scroll.html 需求是一共有兩個,1、單張豎圖持續 ...
  • 前言 對於剛開始學習前端的伙伴倆說,問得最多的問題就是 ——前端技術現在如此繁雜,我到底應該如何學習。這個話題太大了,幾句話回答不好;也由於這個問題確實困擾了很多前端開發人員,所以我也就著手系統的輸出這篇文章。 雖然這篇文章花了很長時間,肯定也有其局限性;希望各位不吝指出。 入題 我們儼然能感受到前 ...
  • Node.js os 模塊提供了一些基本的系統操作函數。 os.tmpdir()返回操作系統的預設臨時文件夾。 os.endianness()返回 CPU 的位元組序,可能的是 "BE" 或 "LE"。 os.hostname()返回操作系統的主機名。 os.type()返回操作系統名 os.plat ...
  • 由於GET請求直接被嵌入在路徑中,URL是完整的請求路徑,包括了?後面的部分,因此你可以手動解析後面的內容作為GET請求的參數。 node.js 中 url 模塊中的 parse 函數提供了這個功能。 var http=require("http"); var url=require("url"); ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...