vue-router 源碼分析——9.別名

這是對vue-router 3 版本的源碼分析。
本次分析會按以下方法進行:

  1. 按官網的使用文檔順序,圍繞著某一功能點進行分析。這樣不僅能學習優秀的項目源碼,更能加深對項目的某個功能是如何實現的理解。這個對自己的技能提升,甚至面試時的回答都非常有幫助。
  2. 在圍繞某個功能展開講解時,所有不相干的內容都會暫時去掉,等后續涉及到對應的功能時再加上。這樣最大的好處就是能循序漸進地學習,同時也不會被不相干的內容影響。省略的內容都會在代碼中以…表示。
  3. 每段代碼的開頭都會說明它所在的文件目錄,方便定位和查閱。如果一個函數內容有多個函數引用,這些都會放在同一個代碼塊中進行分析,不同路徑的內容會在其頭部加上所在的文件目錄。

本章講解router中別名是如何實現的。
另外我的vuex3源碼分析也發布完了,歡迎大家學習:
vuex3 最全面最透徹的源碼分析
還有vue-router的源碼分析:
vue-router 源碼分析——1. 路由匹配
vue-router 源碼分析——2. router-link 組件是如何實現導航的
vue-router 源碼分析——3. 動態路由匹配
vue-router 源碼分析——4.嵌套路由
vue-router 源碼分析——5.編程式導航
vue-router 源碼分析——6.命名路由
vue-router 源碼分析——7.命名視圖
vue-router 源碼分析——8.重定向

官網示例:

  • /a 的別名是 /b,意味著,當用戶訪問 /b 時,URL 會保持為 /b,但是路由匹配則為 /a,就像用戶訪問 /a 一樣。
  • “別名”的功能讓你可以自由地將 UI 結構映射到任意的 URL,而不是受限于配置的嵌套路由結構。
const router = new VueRouter({routes: [{ path: '/a', component: A, alias: '/b' }]
})

Router初始化時對別名的處理

  • 路由的別名和重定向一樣,也會記錄到路由記錄上。通過下面的源碼分析可以發現,別名的數據結構是[]string,這表明我們在定義一個路由的別名時,除了像上面的官網例子中使用字符串path外,還能定義一個數組。這是官網中沒有說明的功能。
  • 之后,遍歷別名數組,創建了一個基于別名路徑的路由記錄。別名路由記錄可以簡單看成除了path,matchAs屬性不同外,其他的內容都和’/a’路由記錄相同。
// ./create-route-map.js
function addRouteRecord(...
) {const { path, name } = route...const record: Record = {alias: route.alias? typeof route.alias === 'string'? [route.alias]: route.alias: [],...                                                                                        }...if (route.alias !== undefined) {const aliases = Array.isArray(route.alias) ? route.alias : [route.alias]for(let i = 0; i < aliases.length; ++i) {const alias = aliases[i]...const aliasRoute = {path: alias,children: route.children            }addRouteRecord(pathList,pathMap,nameMap,aliasRoute,parent,record.path || '/' // matchAs            )}}
}

訪問別名時的邏輯

  • 當用戶訪問的是別名’/b’的url時,觸發的路由匹配會匹配到上面描述的別名路由記錄。然后在生成路由時,調用alias函數執行別名路由生成操作。
  • 在alias函數中,通過別名路由的matchAs屬性(即正式路徑’/a’),進行真正的路由匹配,再創建對應路由。
  • 這樣,就實現了router的別名功能。
// ./create-matcher.js
export function createMatcher(routes: Array<RouteConfig>,router: VueRouter
): Matcher {...function _createRoute(record: ?RouteRecord,location: Location,redirectedFrom?: Location): Route {...if (record && record.matchAs) {return alias(record, location, record.matchAs)        }... }function alias(record: RouteRecord,location: Location,matchAs: string): Route {const aliasedPath = fillParams(matchAs, location.params, `aliased route with path "${matchAs}"`)const aliasedMatch = match({_normalized: true,path: aliasedPath     })if (aliasedMatch) {const matched = aliasedMatch.matchedconst aliasedRecord = matched[matched.length - 1]location.params = aliasedMatch.paramsreturn _createRoute(aliasedRecord, location)}return _createRoute(null, location)}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42195.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DAY1: 實習前期準備

文章目錄 VS Code安裝的插件C/CCMakeGitHub CopilotRemote-SSH收獲 VS Code 下載鏈接&#xff1a;https://code.visualstudio.com 安裝的插件 C/C 是什么&#xff1a;C/C IntelliSense, debugging, and code browsing. 為什么&#xff1a;初步了解如何在VS Code里使用C輸出…

https創建證書

需要下載httpd模塊&#xff1a;yum install httpd -y 前提需要先搭建一個虛擬主機來測試證書創建的效果&#xff0c;以下面www.hehe.com為例&#xff0c;可以參考創建&#xff1a; [rootlocalhost conf.d]# vim vhost.conf <directory /www> allowoverride none requi…

關于小愛同學自定義指令執行

1.前言 之前買了小愛同學音響&#xff0c;一直想讓其讓我的生活變得更智能&#xff0c;編寫一些程序來完成一些自動化任務&#xff0c;但是經過搜索發現&#xff0c;官方開發者平臺不能用了&#xff0c;尋找api階段浪費了我很長時間。最后在github 開源項目發現了倆個比較關鍵…

13.SQL注入-寬字節

SQL注入-寬字節 含義&#xff1a; MySQL是用的PHP語言&#xff0c;然后PHP有addslashes()等函數&#xff0c;這類函數會自動過濾 ’ ‘’ null 等這些敏感字符&#xff0c;將它們轉義成’ ‘’ \null&#xff1b;然后寬字節字符集比如GBK它會自動把兩個字節的字符識別為一個漢…

內容營銷專家劉鑫煒:網站排名需考慮哪些SEO優化技巧?

網站排名的SEO優化技巧包括&#xff1a; 1. 關鍵詞研究&#xff1a;了解目標受眾的搜索關鍵詞&#xff0c;將這些關鍵詞合理地應用在網站的標題、描述、正文和標簽中&#xff0c;有助于提高網站排名。 2. 內容優化&#xff1a;創建高質量、有價值的內容&#xff0c;可以吸引搜…

Qt源碼解析之QObject

省去大部分virtual和public方法后&#xff0c;Qobject主要剩下以下成員&#xff1a; //qobject.h class Q_CORE_EXPORT Qobject{Q_OBJECTQ_PROPERTY(QString objectName READ objectName WRITE setObjectName NOTIFY objectNameChanged)Q_DECLARE_PRIVATE(QObject) public:Q_I…

STM32-OC輸出比較和PWM

本內容基于江協科技STM32視頻內容&#xff0c;整理而得。 文章目錄 1. OC輸出比較和PWM1.1 OC輸出比較1.2 PWM&#xff08;脈沖寬度調制&#xff09;1.3 輸出比較通道&#xff08;高級&#xff09;1.4 輸出比較通道&#xff08;通用&#xff09;1.5 輸出比較模式1.6 PWM基本結…

MATLAB常用語句總結7

MATLAB總結7&#xff1a;常見錯誤歸納 本篇專門用于記錄一些應試技巧 文章目錄 MATLAB總結7&#xff1a;常見錯誤歸納前言一、一些小定義和小技巧二、蒙塔卡羅求解方法1.函數的定義2.函數引用3.代碼量較少的蒙塔卡羅 三、函數引用與多變量四、矩陣引用五、非線性函數&#xff…

14-39 劍和詩人13 - 頂級大模型測試分析和建議

????? 隨著對高級語言功能的需求不斷飆升&#xff0c;市場上涌現出大量語言模型&#xff0c;每種模型都擁有獨特的優勢和功能。然而&#xff0c;駕馭這個錯綜復雜的生態系統可能是一項艱巨的任務&#xff0c;開發人員和研究人員經常面臨選擇最適合其特定需求的模型的挑戰。…

哈弗架構和馮諾伊曼架構

文章目錄 1. 計算機體系結構 2. 哈弗架構&#xff08;Harvard Architecture&#xff09; 3. 改進的哈弗架構 4. 馮諾伊曼架構&#xff08;Von Neumann Architecture&#xff09; 5. 結構對比 1. 計算機體系結構 計算機體系結構是指計算機系統的組織和實現方式&#xff0c…

Python | Leetcode Python題解之第220題存在重復元素III

題目&#xff1a; 題解&#xff1a; class Solution(object):def containsNearbyAlmostDuplicate(self, nums, k, t):from sortedcontainers import SortedSetst SortedSet()left, right 0, 0res 0while right < len(nums):if right - left > k:st.remove(nums[left]…

Python基礎問題匯總

為什么學習Python&#xff1f; 易學易用&#xff1a;Python語法簡潔清晰&#xff0c;易于學習。廣泛的應用領域&#xff1a;適用于Web開發、數據科學、人工智能、自動化腳本等多種場景。強大的庫支持&#xff1a;擁有豐富的第三方庫&#xff0c;如NumPy、Pandas、TensorFlow等…

Sass 語法

文章目錄 編譯變量 \$嵌套 {} > \~導入 import注釋 // /*\* \**/混入 mixin/include繼承 extend數據類型運算控制 if/for/each/while函數 function媒體查詢 media根發出 at-root警告warn/錯誤error/調試debug 編譯 編譯命令 單文件轉換命令 sass input.scss output.css單…

數學基礎 -- 反函數

反函數技術文檔 反函數的定義 反函數&#xff08;inverse function&#xff09;是指一種將函數的輸出反過來作為輸入&#xff0c;從而恢復原來輸入的函數。具體來說&#xff0c;如果有一個函數 f f f&#xff0c;它把一個值 x x x 映射到一個值 y y y&#xff0c;即 f ( …

68.WEB滲透測試-信息收集- WAF、框架組件識別(8)

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a; 易錦網校會員專享課 上一個內容&#xff1a;67.WEB滲透測試-信息收集- WAF、框架組件識別&#xff08;7&#xff09; 右邊這些是waf的…

Mean teacher are better role models-論文筆記

論文筆記 資料 1.代碼地址 2.論文地址 https://arxiv.org/pdf/1703.01780 3.數據集地址 CIFAR-10 https://www.cs.utoronto.ca/~kriz/cifar.html 論文摘要的翻譯 最近提出的Temporal Ensembling方法在幾個半監督學習基準中取得了最先進的結果。它維護每個訓練樣本的標簽…

PCIe驅動開發(1)— 開發環境搭建

PCIe驅動開發&#xff08;1&#xff09;— 開發環境搭建 一、前言 二、Ubuntu安裝 參考: VMware下Ubuntu18.04虛擬機的安裝 三、QEMU安裝 下載網站&#xff1a; https://download.qemu.org 下載文件&#xff1a;qemu-4.1.0-rc5.tar.xz 使用如下命令解壓&#xff1a; tar …

opencv 設置超時時間

經常爬視頻數據&#xff0c;然后用opencv做成圖片 因此設置超時時間很重要 cap.set(cv2.CAP_PROP_FPS, timeout_ms) for idx, row in data.iterrows(): if idx < 400: continue try: # 打開視頻文件 timeout_ms 5000 cap cv2.VideoCapture(row[PLAY_URL]) cap.set(cv2.C…

Linux下使用libiw進行無線信號掃描的實例

打開電腦連接wifi是一件很平常的事情,但這些事情通常都是操作系統下的wifi管理程序替我們完成的,如何在程序中掃描wifi信號其實資料并不多,前面已經有兩篇文章介紹了如何使用ioctl()掃描wifi信號,但其實在Linux下有一個簡單的庫對這些ioctl()的操作進行了封裝,這個庫就是l…

深入追蹤:IPython 中 %tb 命令的異常追蹤棧使用指南

深入追蹤&#xff1a;IPython 中 %tb 命令的異常追蹤棧使用指南 在 IPython 的強大功能中&#xff0c;%tb 命令是一個調試工具&#xff0c;用于在出現異常時查看詳細的異常追蹤棧信息。這對于開發者來說是一個不可或缺的功能&#xff0c;因為它提供了對錯誤發生上下文的深入了…