【vue3 路由使用與講解】vue-router : 簡潔直觀的全面介紹

# 核心內容介紹

  • 路由跳轉有兩種方式:

    • 聲明式導航:<router-link :to="...">
    • 編程式導航:router.push(...) 或?router.replace(...) ;兩者的規則完全一致。
      • push(to: RouteLocationRaw): Promise<NavigationFailure | void | undefined>
        replace(to: RouteLocationRaw): Promise<NavigationFailure | void | undefined>;

    • 由于屬性?to?與?router.push?接受的對象種類相同,所以兩者的規則完全相同。
  • 路由傳參有兩種方法:

    • params:使用動態路由的方式進行傳參;
      • 只為了傳參則不建議用params,params 主要是用來進行動態路由匹配的。
      • 聲明為動態路由,params則是必傳的!除非設置為可選!
      • 聲明路由時設置該路由props參數為true,則會改變功能形態。(傻逼功能,別用)
    • query:拼接在url后面,以?的方式隔開;/urlpath?d1="666"&d2=逆天&arr=["1"]&b=true
      • 傳參時僅建議 string | number | (string|number)[] 類型的數據 ,否則編輯器會 ts 報錯提示。
    • 所有傳參的數據類型如果非字符串會自動字符串化 >> String(xx)
    • params 和 query 的 TS 類型為:string | string[]。也就意味著它并不希望你放亂七八糟的東西在url上,即便你JSON.stringify() 轉換過了。
  • 動態路由:

    • 動態路由的跳轉必須是 name + params,用 path 跳轉命名路由將無效;且 params 必傳!
    • 動態路由以 `/path1/:id` 的方式進行聲明,跳轉路徑結果為 /path/1
    • 動態路由設置的參數例如 :id ,可以將該參數設置為可選參數 `/path1/:id?` ,這樣params就是可傳可不傳了。
  • 命名路由:

    • 就是聲明了路由的 name。name值是唯一的,不管是頂級路由還是嵌套路由。
    • 如果是跳轉嵌套路由里的子路由,path 跳轉需要/xx/xx/child,可直接用該子路由的name。
    • 沒有硬編碼的 URL
    • params?的自動編碼/解碼。
    • 防止你在 url 中出現打字錯誤。
    • 繞過路徑排序(如顯示一個)

# 說明:

? ? ? ? $route / route:? ??有當前路由的所有信息!
? ? ? ? $router / router:? 用來進行路由操作的!?


?# 聲明路由

  • 如何聲明路由

    • 必備的 path? component。其他一堆屬性自己了解相關功能就知道什么時候是必要的,什么時候是非必要的了。有用點的就是name??redirect? children? meta了。
  • 頂級路由

    • 最外層的路由
  • 嵌套路由

    • 聲明路由的 children?
    • 嵌套路由不限層級
    • 想要默認加載一個子路由的話將path設置為空字符串:` path:"" `。
    • 跳轉嵌套路由最好使用 name 方式跳轉,降低心智負擔!
  • 聲明為動態路由,上面講過了,忘了?別怕,那下面代碼也有示例。

  • 路由重定向

    • redirect: { name: 'routeName' }, 設置為路由的name最保險,別想著其他花里胡哨的。

    • 在寫?redirect 的時候,如果不是嵌套路由,可以省略?component 配置。
      你重定向到自己的子路由,那肯定要有?component ?啊,不然你 router-view 在哪(笑)

  • 命名視圖

    • component 變 components,具體看代碼

  • 本示例包含 path , name ,? meta , component , components , children ,? redirect , props , 路由懶加載 , alias 。

import { createRouter, createWebHistory } from 'vue-router'export const router = createRouter({history: createWebHistory(), // 設置路由模式routes: [{// 普通的設置一個普通的路由(頂級路由)path: '/',name: 'HelloWorld',meta: { requiresXXX: true }, // 設置路由元信息,應用場景的話:主要就路由守衛里用的會多一點。該數據只能在這里聲明,其他途徑無法修改。component: () => import('../components/HelloWorld.vue') // 設置路由懶加載},{path: '/routerVue/:id', // 設置為動態路由,id則必傳// path: '/routerVue/:id?', // 設置該動態路由的 id 為可選參數,變為非必傳name: 'routerVue',component: () => import('@/components/xxx.vue')},{path: '/demo',alias: '/hellow', // 你訪問 /hellow,頁面url路徑會保持為/hellow,但是路由匹配則為/demo,顯示 yyyyyy.vue 組件內容component: () => import('@/components/yyyyyy.vue')},{path: '/edit:id?',name: 'edit',// redirect: { name: 'profile' }, // 路由重定向,訪問 /edit 直接重定向為 /edit/profilecomponent: () => import('../components/edit.vue'),props: true, // 設置為true 則在路由組件中,動態路由的參數 會直接放在vue的 props 里。 // 完全不推薦的寫法,增加心智負擔。children: [ // 設置為嵌套路由{// 當 /edit 匹配成功// demo2.vue 將被渲染到 edit 的 <router-view> 內部path: '', // 路徑為'',需要增加name,不然會拋出警告。component: () => import('../components/demo2.vue'),// 命名視圖功能: component 變為 components ,然后設置對應視圖組件的名稱// components:{ // 注意加 s 。。。//   default: () => import('../components/router-test1.vue'),//   template1: () => import('../components/router-test2.vue'),// },// props: {default: true , template1: false} // 可以為每個命名視圖定義 props 配置。還可設置為函數模式(超不推薦,提高代碼維護理解難度,對功能方面沒任何提升)},{// 當 /edit/profile 匹配成功// demo.vue 將被渲染到 edit 的 <router-view> 內部path: 'profile',name: 'profile',component: () => import('../components/profile.vue'),}]},{// 匹配所有路徑,當上述路徑都不滿足時,跳轉到404頁面// 如果項目是有動態添加路由的,注意一定要把該404路由提取出來,等動態添加完路由,再把404添加到動態路由的最后一個。path: '*',name: '404',component: () => import('../components/404.vue'),},],
})


?# 路由跳轉的多種寫法:

聲明式導航寫法:

<router-link :to="{ name: 'vue33', params: { id: 110 }, query: { d1: 'wuwu~~~' } }">vue3.3/3.4新特性</router-link>

編程式導航寫法:(options api里的方式)

this.$router.push({name: 'vue33',params: {id: 110},query: {data: 666}
})

編程式導航寫法:(composition api里的方式)

import { useRouter  } from 'vue-router'
let router = useRouter()
function tiaozhuan() {router.push({name: 'vue33',params: {id: 110},query: {data: 666}})
}

replace 是當前頁面替換新頁面,路由歷史記錄里不會保存當前頁。

import { useRouter  } from 'vue-router'
let router = useRouter()
function tiaozhuan() {router.replace({name: 'vue33',params: {id: 110},query: {data: 666}})
}

如果是嵌套路由則是父路由path + 子路由path,或者子路由的name,并且跳轉時,如果父路由是命名路由,則params也會是必傳!


# 獲取路由參數

跳轉目標路由,聲明了params或query之后,(選項式api寫法) 通過this.$route.params 或 this.$route.query 即可拿到對應的路由參數;

組合式API寫法如下:


import { useRoute } from 'vue-router'let route = useRoute()console.log(route.params);
console.log(route.query);
console.log(route.meta);

# 重新提醒:

route:??有當前路由的所有信息
router: 用來進行路由操作的!?


# 路由的導航守衛

  • 全局守衛;
    • beforeEach :全局前置守衛? (1)
    • beforeResolve?:全局解析守衛? (3)
    • afterEach:全局后置鉤子,該鉤子在已經進入該路由后觸發,所以無需return true 或 next()。? (4)
  • 路由獨享的守衛:
    • beforeEnter :在所有組件內守衛和異步路由組件被解析之后調用。(2)
  • 組件守衛:有3個,其中2個沒屁用。

    • beforeRouteEnter :能處理的 beforeEnter 都可以。

    • beforeRouteUpdate :更沒必要,直接 watch route.params 即可。

    • beforeRouteLeave :有點用,如果用戶跳轉路由時,當前頁面編輯內容未保存,則可以 return false 取消路由跳轉。(setup 內則手動引入 onBeforeRouteLeave)

  • 觸發順序(1)(2)(3)(4)。

    • 組件守衛其中2個懶得算,如果算上 beforeRouteLeave 那 beforeRouteLeave 排在beforeEach 前面。

每個守衛方法接收兩個參數:

  • to:? ? ? 即將要進入的目標 。
  • from:? 當前導航正要離開的路由 。
  • next:? 可選的第三個參數 。(現在根據return 結果來決定了,且更安全(確保調用一次),所以基本不需要next了)
import { createRouter } from 'vue-router'
const router = createRouter({ ... })router.beforeEach((to, from) => {// ...return false  // 返回 false 以取消導航// 如果什么都沒有,undefined 或返回 true,則導航是有效的,并調用下一個導航守衛// return { name: 'Login' } // 將用戶重定向到登錄頁面
})

# 動態添加路由

應用場景示例:頁面菜單和所擁有的路由是根據用戶角色動態生成的,此時就需要配合addRoute功能來實現需求。

//! 動態添加路由、刪除路由、添加嵌套路由
router.addRoute({ path: '/about', component: xxx })// 當路由被刪除時,所有的別名和子路由也會被同時刪除
// 會返回一個回調,調用該函數即可刪除路由 (這種方式可以保證刪的更準點吧。。。)
const removeRoute = router.addRoute({ path: '/about', component: xxx })
removeRoute()
// router.removeRoute('about') 通過路由名稱進行刪除,路由表有同名的話需要注意點(建議路由表name都是唯一的!)// 添加嵌套路由
// router.addRoute({ name: 'admin', path: '/admin', component: Admin })
// router.addRoute('admin', { path: 'settings', component: AdminSettings })
//> 上述代碼等同如如下:
// router.addRoute({
//   name: 'admin',
//   path: '/admin',
//   component: Admin,
//   children: [{ path: 'settings', component: AdminSettings }],
// })

# 查看現有路由?

Vue Router 提供了兩個功能來查看現有的路由:

  • router.hasRoute():檢查路由是否存在。
  • router.getRoutes():獲取一個包含所有路由記錄的數組。


# 路由緩存、過渡

<router-view>、<keep-alive>?和?<transition>?
transition?和?keep-alive?現在必須通過?v-slot?API 在?RouterView?內部使用:

<router-view v-slot="{ Component }"><transition><keep-alive><component :is="Component" /></keep-alive></transition>
</router-view>

# 路由模式

  • Hash 模式:createWebHashHistory
  • HTML5 模式:createWebHistory
import { createRouter, createWebHashHistory } from 'vue-router'
const router = createRouter({history: createWebHashHistory(),routes: [//...],
})

html5模式需要在服務器上設置初次訪問如果404時,進行路由回退:

nginx 如下:

location / {try_files $uri $uri/ /index.html;
}

其他的詳見官網;

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

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

相關文章

JVM內部世界(內存劃分,類加載,垃圾回收)

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要內容&#xff1a;JVM內部世界(內存劃分,類加載,垃圾回收) 關于JVM的學習主要掌握三方面: JVM內存區的劃分類加載垃圾回收 一.JVM內存區的劃分 當一個Java進程開始執行時,JVM會首先向操作系統申…

實例驅動計算機網絡

文章目錄 計算機網絡的層次結構應用層DNSHTTP協議HTTP請求響應過程 運輸層TCP協議TCP協議面向連接實現TCP的三次握手連接TCP的四次揮手斷開連接 TCP協議可靠性實現TCP的流量控制TCP的擁塞控制TCP的重傳機制 UDP協議 網際層IP協議&#xff08;主機與主機&#xff09;IP地址的分類…

php 讀取文件并以文件方式下載

if (!file_exists($filename)){//判斷能否獲取這個文件header("Content-type: text/html; charset=utf-8");echo "File not found!";exit

【創作回顧】17個月崢嶸創作史

#里程碑專區#、#創作者紀念日# 還記得 2022 年 10 月 05 日&#xff0c;我在CSDN撰寫了第 1 篇博客——《關于測試工程師瓶頸和突圍的一個思考》&#xff0c;也是我在全網發布的第一篇技術文章。 回想當時&#xff0c;這一篇的誕生過程并不輕松&#xff0c;不像是一篇網絡文章…

【計算機網絡】深度學習HTTPS協議

&#x1f493; 博客主頁&#xff1a;從零開始的-CodeNinja之路 ? 收錄文章&#xff1a;【計算機網絡】深度學習HTTPS協議 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 目錄 一:HTTPS是什么二:HTTPS的工作過程三:對稱加密四:非對稱加密五:中間人攻擊1…

【web | CTF】BUUCTF [HCTF 2018]WarmUp

天命&#xff1a;這題本地php代碼是無法復現的 首先打開網站&#xff0c;啥也沒有&#xff0c;查看源碼 發現文件&#xff0c;打開訪問一下看看&#xff0c;發現是代碼審計 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whit…

【學習總結】什么是DoS和DDoS

[Q&A] 什么是DoS DoS 是 “Denial of Service”&#xff08;拒絕服務&#xff09;的縮寫&#xff0c;它是一種網絡攻擊方式&#xff0c;其目的是使目標計算機或網絡資源無法為合法用戶提供正常的服務。通過向目標系統發送大量請求、消耗其帶寬、處理器或內存等資源&#…

13 雙口 RAM IP 核

雙口 RAM IP 核簡介 雙口 RAM IP 核有兩個端口&#xff0c;它又分為偽雙端口 RAM 和真雙端口 RAM&#xff0c;偽雙端口 RAM 一個端口只能讀&#xff0c;另一個端口只能 寫&#xff0c;真雙端口 RAM 兩個端口都可以進行讀寫操作。同時對存儲器進行讀寫操作時就會用到雙端口 RAM…

unity-1

創建游戲對象&#xff08;游戲物體&#xff09; 可通過unity中的菜單欄中的Gameobject創建&#xff1b;也可在Hierarchy&#xff08;層級&#xff09;中創建&#xff0c; 雙擊即可居中看到。 在Hierarchy空白處右鍵即可看到&#xff0c;能創建游戲對象。 在Scene框中&#x…

BioTech - ADMET的性質預測 概述

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136438192 ADMET&#xff0c;即 Absorption、Distribution、Metabolism、Excretion、Toxicity&#xff0c;吸收、分布、代謝、排泄、毒性…

題目 1629: 藍橋杯算法訓練VIP-接水問題

題目描述: 學校里有一個水房&#xff0c;水房里一共裝有m個龍頭可供同學們打開水&#xff0c;每個龍頭每秒鐘的供水量相等&#xff0c;均為1。現在有n名同學準備接水&#xff0c;他們的初始接水順序已經確定。將這些同學按接水順序從1到n編號&#xff0c;i號同學的接水量為wi。…

Linux shell:補充命令的使用

目錄 一.導讀 二.正文 三.結語 一.導讀 上一篇介紹了腳本的簡單概念以及使用&#xff0c;現在補充一些命令。 二.正文 目前處于全局目錄&#xff0c;通過mkdir創建名我為day01的文件。 通過cd命令day01 切換至day01文件當中。 使用vim文本編輯器文件名&#xff08;firstdir&…

設計模式學習筆記——工廠方法模式

設計模式&#xff08;創建型&#xff09;—— 工廠方法模式 傳統的獲取對象方法&#xff0c;是通過 new 關鍵字獲取一個對象&#xff0c;但是如果多個地方都需要該對象&#xff0c;就需要 new 很多次&#xff0c;這時候如果這個類發生了一些改變&#xff0c;如類名變了&#x…

靜態上下文調用了非靜態上下文

問題描述&#xff1a; static修飾的方法不能調用非static修飾方法 問題原因&#xff1a; 在Java中&#xff0c;靜態方法&#xff08;如main方法&#xff09;可以直接訪問靜態成員&#xff08;包括靜態變量和靜態方法&#xff09;&#xff0c;但不能直接訪問非靜態成員&#…

【Python】進階學習:pandas--query()用法詳解

&#x1f4da;【Python】進階學習&#xff1a;pandas–query()用法詳解 &#x1f308; 個人主頁&#xff1a;高斯小哥 &#x1f525; 高質量專欄&#xff1a;Matplotlib之旅&#xff1a;零基礎精通數據可視化、Python基礎【高質量合集】、PyTorch零基礎入門教程&#x1f448; 希…

劍指offer面試題24 二叉樹搜索樹的后續遍歷序列

考察點 二叉搜索樹&#xff0c;樹的后序遍歷知識點 題目 分析 本題目要求判斷某序列是否是二叉搜索樹的后序遍歷序列&#xff0c;后序遍歷的特點是左右根&#xff0c;因此序列的最后一個元素肯定是根結點&#xff0c;而前面的序列可以分為倆部分&#xff0c;第一部分是左子樹…

LeetCode --- 無重復字符的最長子串

題目描述 無重復字符的最長子串 找到無重復的最長連續字符串。 示例1中 abc | bca | cab 都符合題意。輸出3即可。 代碼 可以使用暴力枚舉 哈希表&#xff0c;哈希表來判斷是否重復&#xff0c;枚舉來判斷每一種情況&#xff0c;需要開兩層for循環&#xff0c;時間復雜度n…

linux高級編程:線程(二)、進程間的通信方式

線程&#xff1a; 回顧線程&#xff08;一&#xff09;&#xff1a; 1.線程間通信問題 線程間共享同一個資源&#xff08;臨界資源&#xff09; 互斥&#xff1a; 排他性訪問 linux系統 -- 提供了Posix標準的函數庫 -- 互斥量&#xff08;互斥鎖&#xff09; 原子操作&#x…

精通Matplotlib:從入門到精通的繪圖指南

在本篇文章中&#xff0c;我們將深入探索Matplotlib庫&#xff0c;這是一個強大的Python繪圖庫&#xff0c;廣泛用于數據可視化。Matplotlib讓我們能夠以簡單而直觀的方式創建各種靜態、動態和交互式的圖表。無論你是數據分析師、科研人員&#xff0c;還是任何需要數據可視化的…

用Redis如何實現延遲隊列?

在Redis中實現延遲隊列可以利用有序集合&#xff08;Sorted Set&#xff09;和定時任務的方式。下面是一個基本的實現思路&#xff1a; 添加延遲任務&#xff1a; 將任務信息作為一個字符串存儲在Redis中&#xff0c;同時將其對應的執行時間作為分數(score)存儲在有序集合中。使…