Vue 3 入門教程 8 - 路由管理 Vue Router

一、Vue Router 簡介

Vue Router 是 Vue.js 官方的路由管理器,它與 Vue.js 核心深度集成,用于構建單頁面應用(SPA)。單頁面應用是指整個應用只有一個 HTML 頁面,通過動態切換頁面內容來模擬多頁面跳轉的效果,從而提升用戶體驗和頁面加載效率。

Vue Router 的核心功能包括:

  • 嵌套路由映射:支持根據組件結構嵌套路由配置。
  • 路由參數:可以在路由路徑中傳遞參數,實現動態路由。
  • 路由守衛:提供了導航守衛功能,用于控制路由的訪問權限等。
  • 編程式導航:通過 JavaScript 代碼實現路由跳轉。
  • 命名路由和命名視圖:便于更靈活地配置和使用路由。

二、Vue Router 的安裝與配置

2.1 安裝 Vue Router

在 Vue 3 項目中,通過 npm 或 yarn 安裝 Vue Router(需安裝 4.x 版本,適配 Vue 3):

# 使用 npmnpm install vue-router@4# 使用 yarnyarn add vue-router@4

2.2 基本配置

首先,創建路由配置文件,定義路由規則;然后,在入口文件中創建路由實例并掛載到應用。

步驟 1:創建路由配置文件
// router/index.jsimport { createRouter, createWebHistory } from 'vue-router'// 導入組件import Home from '../views/Home.vue'import About from '../views/About.vue'// 路由規則數組,每個規則對應一個路由const routes = [{path: '/', // 路由路徑name: 'Home', // 路由名稱(可選)component: Home // 路由對應的組件},{path: '/about',name: 'About',component: About// 也可以使用懶加載的方式導入組件(推薦)// component: () => import('../views/About.vue')}]// 創建路由實例const router = createRouter({// 路由模式:createWebHistory 是 HTML5 history 模式(無 # 號)// 另一種是 createWebHashHistory(有 # 號)history: createWebHistory(),routes // 路由規則})export default router

懶加載組件的方式可以減小初始打包體積,提高頁面加載速度,推薦在實際項目中使用。

步驟 2:在入口文件中掛載路由
// main.jsimport { createApp } from 'vue'import App from './App.vue'import router from './router' // 導入路由實例import { createPinia } from 'pinia'const app = createApp(App)const pinia = createPinia()app.use(pinia)app.use(router) // 掛載路由app.mount('#app')
步驟 3:在根組件中添加路由出口

路由出口(<router-view>)是路由對應的組件渲染的位置,需要在根組件(通常是 App.vue)中添加:

<!-- App.vue --><template><div id="app"><!-- 路由導航鏈接 --><nav><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link></nav><!-- 路由出口:匹配的組件將在這里渲染 --><router-view /></div></template><style>/* 可以為激活的路由鏈接添加樣式 */router-link.active {color: red;text-decoration: none;}</style>

<router-link> 用于生成路由導航鏈接,to 屬性指定目標路由路徑。默認會被渲染為 <a> 標簽,當路由匹配時,會自動添加 active 類,便于設置激活樣式。

三、路由跳轉與參數傳遞

3.1 聲明式導航(<router-link>)

通過 <router-link> 標簽實現路由跳轉,適用于模板中的靜態導航。

基本用法
<template><div><!-- 直接指定路徑 --><router-link to="/">首頁</router-link><!-- 使用路由名稱(配合 params 傳遞參數時必須使用名稱) --><router-link :to="{ name: 'About' }">關于我們</router-link></div></template>
傳遞參數

可以通過路由路徑的動態片段(params)或查詢字符串(query)傳遞參數。

params 參數(動態路由)

首先,在路由規則中定義動態片段(以 : 開頭):

// router/index.jsconst routes = [{path: '/user/:id', // :id 是動態參數name: 'User',component: () => import('../views/User.vue')}]

然后,在導航時傳遞參數:

<template><div><!-- 直接在路徑中傳遞參數 --><router-link to="/user/123">用戶 123</router-link><!-- 使用路由名稱和 params 傳遞參數 --><router-link :to="{ name: 'User', params: { id: 456 } }">用戶 456</router-link></div></template>

在目標組件中獲取 params 參數:

<!-- views/User.vue --><template><div><h1>用戶頁面</h1><p>用戶 ID:{{ $route.params.id }}</p></div></template><script setup>import { useRoute } from 'vue-router'// 在組合式 API 中,通過 useRoute 獲取路由信息const route = useRoute()console.log('用戶 ID:', route.params.id)</script>
query 參數(查詢字符串)

query 參數類似于 URL 中的查詢字符串(如 ?name=張三&age=20),無需在路由規則中定義,直接傳遞即可:

<template><div><router-link :to="{ path: '/search', query: { keyword: 'vue', page: 1 } }">搜索</router-link></div></template>

在目標組件中獲取 query 參數:

<!-- views/Search.vue --><template><div><h1>搜索頁面</h1><p>關鍵詞:{{ $route.query.keyword }}</p><p>頁碼:{{ $route.query.page }}</p></div></template><script setup>import { useRoute } from 'vue-router'const route = useRoute()console.log('搜索關鍵詞:', route.query.keyword)</script>

3.2 編程式導航(router.push)

通過 JavaScript 代碼調用 router.push 方法實現路由跳轉,適用于需要在事件處理或邏輯判斷后進行導航的場景。

在組合式 API 中,通過 useRouter 獲取路由實例:

<template><div><button @click="goToHome">前往首頁</button><button @click="goToUser">前往用戶頁面</button><button @click="goToSearch">前往搜索頁面</button></div></template><script setup>import { useRouter } from 'vue-router'// 獲取路由實例const router = useRouter()// 前往首頁const goToHome = () => {router.push('/')// 或使用路由名稱// router.push({ name: 'Home' })}// 前往用戶頁面(傳遞 params 參數)const goToUser = () => {router.push({ name: 'User', params: { id: 789 } })}// 前往搜索頁面(傳遞 query 參數)const goToSearch = () => {router.push({path: '/search',query: { keyword: 'pinia', page: 2 }})}</script>

router.push 的參數格式與 <router-link> 的 to 屬性一致,可以是字符串路徑,也可以是包含 path、name、params、query 等的對象。

四、嵌套路由

嵌套路由用于實現頁面的層級結構,例如在父頁面中嵌套子頁面。

4.1 配置嵌套路由

在路由規則中,通過 children 屬性定義子路由:

// router/index.jsconst routes = [{path: '/dashboard',name: 'Dashboard',component: () => import('../views/Dashboard.vue'),// 子路由children: [{// 子路由的 path 可以不帶 /,表示相對父路由路徑path: 'profile',name: 'Profile',component: () => import('../views/Profile.vue')},{path: 'settings',name: 'Settings',component: () => import('../views/Settings.vue')}]}]

4.2 在父組件中添加子路由出口

父組件需要包含 <router-view> 作為子路由的出口,子路由對應的組件會渲染到這里:

<!-- views/Dashboard.vue --><template><div><h1>儀表盤</h1><nav><router-link to="/dashboard/profile">個人資料</router-link> |<router-link to="/dashboard/settings">設置</router-link></nav><!-- 子路由出口:子組件會在這里渲染 --><router-view /></div></template>

訪問 /dashboard/profile 時,Profile 組件會渲染到 Dashboard 組件的 <router-view> 中;訪問 /dashboard/settings 時,Settings 組件會渲染到該位置。

五、路由守衛

路由守衛用于在路由導航過程中進行攔截和控制,例如驗證用戶登錄狀態、權限檢查等。Vue Router 提供了全局守衛、路由獨享守衛和組件內守衛。

5.1 全局前置守衛(beforeEach)

全局前置守衛會在每次路由跳轉前觸發,適用于全局的權限控制。

// router/index.jsimport router from './index'router.beforeEach((to, from, next) => {// to:即將要進入的目標路由對象// from:當前正要離開的路由對象// next:函數,決定是否繼續導航console.log('即將從', from.path, '跳轉到', to.path)// 示例:判斷用戶是否登錄,未登錄則跳轉到登錄頁const isLogin = localStorage.getItem('isLogin') === 'true'// 不需要登錄的路由白名單const whiteList = ['/login']if (whiteList.includes(to.path)) {// 白名單路由,直接放行next()} else {if (isLogin) {// 已登錄,放行next()} else {// 未登錄,跳轉到登錄頁next('/login')}}})

next 函數的用法:

  • next():繼續導航到目標路由。
  • next('/path') 或 next({ path: '/path' }):跳轉到指定路由。
  • next(false):中斷當前導航。

5.2 組件內守衛

組件內守衛包括 beforeRouteEnter、beforeRouteUpdate 和 beforeRouteLeave,定義在組件內部。

<!-- views/Profile.vue --><template><div><h1>個人資料</h1></div></template><script setup>import { onBeforeRouteEnter, onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'// 進入組件前觸發(此時組件實例還未創建,不能使用 this 或 setup 中的變量)onBeforeRouteEnter((to, from, next) => {console.log('即將進入個人資料頁面')// 可以通過 next 的回調函數訪問組件實例next(vm => {// vm 是組件實例console.log('組件實例:', vm)})})// 組件更新時觸發(例如路由參數變化但組件復用)onBeforeRouteUpdate((to, from, next) => {console.log('個人資料頁面路由參數發生變化')next()})// 離開組件時觸發onBeforeRouteLeave((to, from, next) => {console.log('即將離開個人資料頁面')// 示例:提示用戶是否保存修改const isSave = confirm('是否保存修改?')if (isSave) {next()} else {// 取消離開next(false)}})</script>

六、總結

Vue Router 是 Vue 3 構建單頁面應用的核心工具,通過本文的學習,我們掌握了其基本概念、安裝配置、路由跳轉與參數傳遞、嵌套路由和路由守衛等核心功能。

在實際開發中,合理規劃路由結構、使用懶加載優化性能、通過路由守衛控制權限,能夠構建出體驗良好的單頁面應用。后續還可以深入學習命名視圖、路由元信息、滾動行為等高級特性,進一步提升路由的使用效率。

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

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

相關文章

django的數據庫原生操作sql

from django.db import connection from django.db import transaction from django.db.utils import (IntegrityError,OperationalError,ProgrammingError,DataError ) from django.utils import timezoneclass Db(object):"""數據庫操作工具類&#xff0c;封裝…

FreeRTOS---基礎知識2

1. FreeRTOS 調度機制概述FreeRTOS 是一個實時操作系統&#xff08;RTOS&#xff09;&#xff0c;其核心功能是通過 調度器&#xff08;Scheduler&#xff09; 管理多個任務的執行。調度機制決定了 何時切換任務 以及 如何選擇下一個運行的任務&#xff0c;以滿足實時性、優先級…

Docker安裝(精簡述版)

1. 安裝&#xff1a;Docker 環境&#xff08;Docker desktop&#xff09; #Windows架構版本查看&#xff0c;Win R? 輸入 ?cmd? 打開命令提示符&#xff1b;輸入命令?&#xff1a; bash echo %PROCESSOR_ARCHITECTURE%#安裝Docker desktop&#xff08;安裝時勾選 WSL2&am…

Postman-win64-7.3.5-Setup.exe安裝教程(附詳細步驟+桌面快捷方式設置)?

Postman 是一款超常用的接口調試工具&#xff0c;程序員和測試人員用它來發送網絡請求、測試API接口、調試數據交互? 1. 雙擊安裝包? 安裝包下載地址&#xff1a;https://pan.quark.cn/s/4b2960d60ae9&#xff0c;找到你下的 Postman-win64-7.3.5-Setup.exe 文件&#xff08…

149. Java Lambda 表達式 - Lambda 表達式的序列化

文章目錄149. Java Lambda 表達式 - Lambda 表達式的序列化為什么要序列化 Lambda 表達式&#xff1f;Lambda 表達式的序列化規則示例代碼&#xff1a;序列化 Lambda 表達式代碼解析&#xff1a;Lambda 序列化的限制總結&#xff1a;149. Java Lambda 表達式 - Lambda 表達式的…

頤頓機電攜手觀遠BI數據:以數據驅動決策,領跑先進制造智能化升級

頤頓機電簽約觀遠數據&#xff0c;聚焦財務分析、銷售管理等場景&#xff0c;以 BI 數據解決方案推進數據驅動決策&#xff0c;助力先進制造企業提效與競爭力升級。一、合作官宣&#xff1a;頤頓機電 觀遠數據&#xff0c;開啟數據應用新征程浙江頤頓機電有限公司&#xff08;…

【PHP】幾種免費的通過IP獲取IP所在地理位置的接口(部分免費部分收費)

目錄 一、獲取客戶端IP地址 二、獲取IP所在地理位置接口 1、IP域名歸屬地查詢 2、騰訊地圖 - IP定位 3、聚合數據 - IP地址&#xff08;推薦&#xff09; 4、高德地圖 - IP定位&#xff08;推薦&#xff09; 5、360分享計劃 - IP查詢 6、天聚ip地址查詢 7、百度IP地址…

【Excel】制作雙重餅圖

一、效果話不多說&#xff0c;直接上數據和效果圖&#xff01;&#xff08;示例軟件&#xff1a;WPS Office&#xff09;類別現金刷卡小計蘋果10.005.0015.00荔枝20.0015.0035.00西瓜30.0025.0055.00總計60.0045.00105.00二、步驟&#xff08;一&#xff09;制作底圖插入餅圖&a…

gcc-arm-none-eabi安裝后,找不到libgcc.a的拉置

位置在&#xff1a;/usr/lib/gcc/arm-none-eabi/6.3.1/libgcc.a查找方法&#xff1a;arm-none-eabi-gcc --print-libgcc-file-name以前沒找到&#xff0c;是因為進錯目錄&#xff1a;/usr/lib/arm-none-eabi/lib

上證50期權2400是什么意思?

本文主要介紹上證50期權2400是什么意思&#xff1f;“上證50期權2400”通常指上證50ETF期權的某個具體合約代碼&#xff0c;其中“2400”是合約代碼的一部分&#xff0c;需結合完整代碼格式理解其含義。上證50期權2400是什么意思&#xff1f;一、上證50期權合約代碼的組成上證5…

發那科機器人P點位置號碼自動變更功能為禁用狀態

通過改變變量的狀態&#xff0c;發那科機器人可以實現&#xff0c;當在程序中進行記錄、修改、插入、刪除、復制/粘貼包含有P點位置號碼的行時&#xff0c;P點位置號碼會自動從小到大自動排列&#xff0c;可以實現自動排列&#xff0c;或者點擊編輯變更編號也可以下圖所示女變量…

什么叫湖倉一體

文章目錄概念一、理解湖倉一體&#xff1a;先搞懂“數據湖”和“數據倉庫”1. 數據倉庫&#xff08;Data Warehouse&#xff09;2. 數據湖&#xff08;Data Lake&#xff09;3. 傳統架構的痛點&#xff1a;“湖”與“倉”的割裂二、湖倉一體的核心特點&#xff1a;融合“湖”與…

網絡安全突發事件應急預案方案

最近有要求需要出一個網絡安全突發事件應急預案方案&#xff0c;本文僅就應急預案問題提出一點初步思考&#xff0c;意在拋磚引玉&#xff0c;盼各位讀者不吝賜教&#xff0c;共同完善對這一領域的認識。一、總則 &#xff08;一&#xff09;目的 為有效應對規劃建筑設計院企業…

【基于3D Gaussian Splatting的三維重建】保姆級教程 | 環境安裝 | 制作-訓練-測試自己數據集 | torch | colmap | ffmpeg | 全過程圖文by.Akaxi

目錄 一.【3DGS環境配置】 1.1 克隆3DGS倉庫 1.2 安裝Visual Studio 2022 1.2.1 下載Visual Studio 2022 1.2.2 更改環境變量 1.3 創建環境 1.3.1 創建python環境 1.3.2 離線安裝torch包 1.3.3 安裝依賴包 1.3.4安裝子模塊 &#xff08;1&#xff09;報錯解決&…

C#泛型委托講解

1. 泛型&#xff08;Generics&#xff09; 泛型允許編寫類型安全且可重用的代碼&#xff0c;避免裝箱拆箱操作&#xff0c;提高性能。 泛型類 // 定義泛型類 public class GenericList<T> {private T[] items;private int count;public GenericList(int capacity){items …

【DL學習筆記】DL入門指南

DL入門指南 資料課程 李沐老師 《動手學深度學習》 https://tangshusen.me/Dive-into-DL-PyTorch/李宏毅老師課程 https://speech.ee.ntu.edu.tw/~hylee/ml/2021-spring.php DL入門必掌握知識點 數據處理 &#xff1a; numpy、torch地址處理 &#xff1a; os、pathlib文件處…

在 uni-app 中進行路由跳轉前的權限驗證(檢查用戶是否登錄)

使用場景&#xff1a; 適用于需要登錄才能訪問的 uni-app 應用保護需要認證的頁面不被未授權用戶訪問統一處理路由跳轉的權限控制 /utils/cookies.js下的部分代碼內容&#xff1a; // #ifdef H5 import Cookies from js-cookie // #endif// ums const tokenKey user_center_to…

垃圾收集器ParNewCMS與底層三色標記算法詳解

垃圾收集技術詳解筆記 1. 分代收集理論 當前虛擬機的垃圾收集采用分代收集算法&#xff0c;根據對象存活周期將內存分為不同代區&#xff0c;以優化回收效率。 核心分區&#xff1a; 新生代&#xff08;Young Generation&#xff09;&#xff1a;對象存活周期短&#xff0c;約9…

全排列(回溯算法)

本文參考代碼隨想錄 給定一個 沒有重復 數字的序列&#xff0c;返回其所有可能的全排列。 示例: 輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 排列是有序的&#xff0c;在排列問題中不需要startIndex&#xff1b;但排列問題需要一個…

在線任意長度大整數計算器

具體請前往&#xff1a;在線大整數計算器--支持超大整數的加減乘除,冪運算/模運算,最大公約數&#xff0c;最小公倍數