Vue 3 路由跳轉全面指南(Composition API + <script setup>)

一、前言:為什么要學習 Vue Router?

在單頁面應用(SPA)開發中,路由管理是核心功能之一。Vue Router 作為 Vue.js 官方推薦的路由解決方案,與 Vue.js 深度集成,提供了以下重要功能:

  • 頁面無刷新跳轉:保持應用狀態的同時切換視圖
  • 嵌套路由:構建復雜的頁面布局結構
  • 路由守衛:控制導航權限和邏輯
  • 動態路由:根據需求加載路由配置
  • 滾動行為控制:提升用戶體驗

本教程將使用 Vue 3 的 Composition API 和 <script setup> 語法糖,這是目前最推薦的使用方式,代碼更簡潔,邏輯更清晰。

二、環境準備:創建帶路由的 Vue 項目

對于初學者,推薦使用 Vite 創建 Vue 項目:

npm create vite@latest my-vue-app --template vue
cd my-vue-app
npm install vue-router@4
npm run dev

三、基礎路由配置詳解

1. 創建路由實例

src/router/index.js 中:

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'// 定義路由配置
const routes = [{path: '/',  // 訪問路徑name: 'home', // 路由名稱(可選但推薦)component: HomeView // 對應的組件},{path: '/about',name: 'about',// 路由懶加載(性能優化)component: () => import('../views/AboutView.vue')}
]// 創建路由實例
const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL), // 使用HTML5 history模式routes // 注入路由配置
})export default router

2. 在主文件中安裝路由

src/main.js 中:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router' // 導入路由配置const app = createApp(App)app.use(router) // 使用路由插件app.mount('#app')

3. 在 App.vue 中添加路由視圖

<script setup>
// 這里可以導入需要的組件或邏輯
</script><template><header><!-- 導航鏈接 --><nav><router-link to="/">首頁</router-link><router-link to="/about">關于</router-link></nav></header><!-- 路由匹配的組件將渲染在這里 --><router-view></router-view>
</template><style>
/* 基礎樣式 */
.router-link-active {font-weight: bold;
}
</style>

四、編程式導航的三種常用方式

1. 字符串路徑

最簡單直接的跳轉方式:

<script setup>
import { useRouter } from 'vue-router'const router = useRouter()const goToAbout = () => {router.push('/about') // 直接使用路徑字符串
}
</script><template><button @click="goToAbout">關于我們</button>
</template>

2. 命名路由(推薦)

使用路由配置中的 name 屬性,更易于維護:

<script setup>
import { useRouter } from 'vue-router'const router = useRouter()const goToHome = () => {router.push({ name: 'home' }) // 使用路由名稱
}
</script>

3. 帶參數的對象形式

最靈活的方式,可以添加各種參數:

<script setup>
import { useRouter } from 'vue-router'const router = useRouter()const goToUserProfile = () => {router.push({name: 'user', // 路由名稱params: { id: 123 }, // 路徑參數query: { tab: 'profile' }, // 查詢參數hash: '#contact' // 哈希值})
}
</script>

五、路由傳參的三種方法對比

1. params 傳參(動態路由)

適用場景:參數是路徑的一部分,如 /user/123

路由配置:

{path: '/user/:id', // 動態路徑參數name: 'user',component: UserView
}

跳轉方法:

router.push({ name: 'user', params: { id: 123 } })

接收參數:

<script setup>
import { useRoute } from 'vue-router'const route = useRoute()
const userId = route.params.id // 123
</script>

2. query 傳參(查詢參數)

適用場景:可選參數,如 /search?q=vue

跳轉方法:

router.push({path: '/search',query: { q: 'vue', page: 1 }
})

接收參數:

<script setup>
import { useRoute } from 'vue-router'const route = useRoute()
const searchQuery = route.query.q // 'vue'
const pageNum = route.query.page // '1' (注意是字符串)
</script>

3. props 傳參(最推薦)

優點:組件不直接依賴路由,更易于復用

路由配置:

{path: '/product/:id',name: 'product',component: ProductView,props: true // 將params轉為props// 或者使用函數形式更靈活// props: route => ({ id: route.params.id, query: route.query })
}

組件接收:

<script setup>
defineProps({id: {type: String,required: true}
})
</script>

六、導航守衛實戰

1. 全局前置守衛(常用做權限控制)

// router/index.js
router.beforeEach((to, from, next) => {const isAuthenticated = checkLoginStatus() // 你的驗證邏輯if (to.meta.requiresAuth && !isAuthenticated) {// 如果需要登錄且未登錄,跳轉到登錄頁next({ name: 'login' })} else if (to.name === 'login' && isAuthenticated) {// 如果已登錄又訪問登錄頁,跳轉到首頁next({ name: 'home' })} else {// 正常放行next()}
})

2. 組件內守衛(處理未保存更改等場景)

<script setup>
import { onBeforeRouteLeave } from 'vue-router'const unsavedChanges = ref(false)// 用戶嘗試離開時提示
onBeforeRouteLeave((to, from, next) => {if (unsavedChanges.value) {const confirmLeave = confirm('您有未保存的更改,確定要離開嗎?')if (confirmLeave) {next()} else {next(false) // 取消導航}} else {next()}
})
</script>

七、常見問題解決方案

1. 路由重復導航錯誤

router.push('/some-path').catch(err => {if (err.name !== 'NavigationDuplicated') {// 如果不是重復導航錯誤,拋出其他錯誤throw err}
})

2. 響應式監聽路由參數變化

<script setup>
import { useRoute } from 'vue-router'
import { watch } from 'vue'const route = useRoute()// 監聽id參數變化
watch(() => route.params.id,(newId) => {if (newId) {fetchData(newId) // 重新獲取數據}},{ immediate: true } // 立即執行一次
)
</script>

八、最佳實踐建議

  1. 路由命名:始終為路由設置 name 屬性,便于維護
  2. 懶加載:路由組件盡量使用 () => import() 語法
  3. 參數傳遞:優先使用 props 方式,提高組件復用性
  4. 導航守衛:合理使用,避免過度復雜的邏輯
  5. 錯誤處理:對可能失敗的導航添加錯誤處理

九、總結

通過本教程,你應該已經掌握了:

? Vue Router 的基本配置方法
? 編程式導航的各種使用場景
? 三種路由傳參方式及適用情況
? 導航守衛的實際應用
? 常見問題的解決方案

路由是 Vue 單頁面應用的核心,建議初學者多動手實踐,嘗試不同的配置和跳轉方式。遇到問題時,可以查閱 Vue Router 官方文檔 獲取最新信息。

如果有任何疑問,歡迎在評論區留言討論!

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

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

相關文章

JavaScript基礎-常用的鍵盤事件

一、前言 在網頁開發中&#xff0c;用戶交互 是非常重要的一環。除了鼠標操作之外&#xff0c;鍵盤事件也是前端開發中最常見的交互方式之一。 JavaScript 提供了多個用于監聽和處理鍵盤輸入的事件&#xff0c;例如 keydown、keyup 和 keypress。掌握這些事件可以幫助我們實現…

解決 Android 項目下載依賴缺失導致的問題

解決 Android 項目下載依賴缺失導致的問題 在項目根目錄下的 build.gradle 文件中增加下面的代碼&#xff1a; buildscript {repositories {...maven {url "https://maven.aliyun.com/repository/jcenter"}maven {url "https://maven.aliyun.com/repository/c…

Clang Code Model: Error: The clangbackend executable “D:\Soft\Qt5.12.12\Tool

Qt Creator->菜單->幫助->關于插件->C>去掉ClangCodeModel勾選->重啟Qt Creator 參考&#xff1a;【問題解決】Qt Creator 報錯&#xff1a;Clang Code Model: Error: The clangbackend executable_qt clang code model-CSDN博客

高頻面試之12 HBase

12 HBase 文章目錄 12 HBase12.1 HBase存儲結構12.2 HBase的寫流程12.3 HBase的讀流程12.6 HBase的合并12.7 RowKey設計原則12.8 RowKey如何設計12.9 HBase二級索引原理 12.1 HBase存儲結構 架構角色&#xff1a; 1&#xff09;Master 實現類為HMaster&#xff0c;負責監控集群…

Vue3 + TypeScript + Element Plus 表格實例null檢查方法

代碼分析&#xff1a; // 表格實例對象 const tableRef ref<ElTableExtendedInstance | null>(null); // 表格列配置列表 const columnConfigs ref<IColumnConfig[]>([{ prop: "index", label: "序號", width: 60 },{ prop: "batchNo&…

Neo4j常見語法-unwind

unwind的用法&#xff08;UNWIND 是一個強大的操作符&#xff0c;用于將集合&#xff08;列表、數組&#xff09;展開為多行數據。它類似于關系型數據庫中的 UNNEST 或 LATERAL JOIN&#xff0c;是 Cypher 查詢中處理集合數據的核心工具&#xff09; &#xff08;1&#xff09;…

JavaEE-Spring-IoCDI

Spring是?個開源框架, 他讓我們的開發更加簡單. 他?持?泛的應?場 景, 有著活躍?龐?的社區, 這也是Spring能夠?久不衰的原因. 但是這個概念相對來說, 還是?較抽象. ??句更具體的話來概括Spring, 那就是: Spring 是包含了眾多?具?法的 IoC 容器 容器是?來容納…

CppCon 2017 學習:10 Core Guidelines You Need to Start Using Now

C.45: 不要定義一個僅僅初始化成員變量的默認構造函數&#xff0c;而是使用類內成員初始化器 如果你有一個默認構造函數&#xff0c;它的唯一作用是給成員變量賦默認值&#xff08;如 1、2、3&#xff09;&#xff0c;這更清晰、簡單的方法是直接在成員變量聲明時使用類內初始…

Java并發編程實戰 Day 28:虛擬線程與Project Loom

【Java并發編程實戰 Day 28】虛擬線程與Project Loom 文章內容 在“Java并發編程實戰”系列的第28天&#xff0c;我們將聚焦于**虛擬線程&#xff08;Virtual Threads&#xff09;**和 Project Loom&#xff0c;這是 Java 在高并發場景下的一次重大革新。隨著現代應用對性能和…

Linux系統移植⑦:uboot啟動流程詳解-board_init_r執行過程

Linux系統移植⑦&#xff1a;uboot啟動流程詳解-board_init_r執行過程 在uboot中&#xff0c;board_init_r 是啟動流程中的一個關鍵函數&#xff0c;負責完成板級&#xff08;board-specific&#xff09;的后期初始化工作。以下是關于該函數的詳細說明&#xff1a; 1. 函數作…

OpenStack入門體驗

1.1云計算概述 相信大家都聽到很多的阿里云、騰訊云、百度云等等這些詞,那到底什么是云計算?云 計算又能做什么? 1.1.1什么是云計算 云計算(cloud computing)是一種基于網絡的超級計算模式,基于用戶的不同需求,提供所需的資源,包括計算資源、存儲資源、網絡資源等。云計算…

RK 安卓10/11平臺 HDMI-IN 調試

這篇文章我們介紹一下在安卓9、10、11的版本上&#xff0c;rk平臺的hdmi-in功能是如何實現的&#xff0c;下篇文章我們再介紹安卓12之后的版本有了什么變化。希望對在rk平臺調試hdmi-in功能的朋友有一些幫助。 目錄 &#xff08;1&#xff09;概述 &#xff08;2&#xff09;…

MongoDB學習記錄(快速入門)

MongoDB核心 基礎概念 數據庫 數據庫是按照數據結構來組織、存儲和管理數據的倉庫。在內存中運行的&#xff0c;一旦程序運行結束或者計算機斷電&#xff0c;程序運行中的數據都會丟失。我們需要將一些程序運行的數據持久化到硬盤之中&#xff0c;以確保數據的安全性。數據庫…

阿里一面:微服務拆分需要考慮什么因素?

要拆分微服務&#xff0c;首先我們要了解微服務拆了會有什么問題&#xff1f;怎么合理拆服務&#xff1f; 拆分服務會帶來什么問題&#xff1f; 舉個電商系統下單扣庫存的例子。 對于單體應用&#xff0c;通訊在進程內部進行&#xff0c;下單方法調用扣庫存方法&#xff0c;…

3D高斯潑濺和4D高斯

1.高斯函數 想象你往平靜的湖水里扔一塊石頭&#xff0c;水波會以石頭落點為中心向外擴散&#xff0c;形成一個逐漸衰減的圓形波紋。高斯函數的形狀就和這個波紋類似&#xff1a; 中心最高&#xff08;石頭落點&#xff0c;波峰最強&#xff09;。越往外&#xff0c;高度&…

comfyui插件和comfyui mac安裝

mac comfyui安裝包 ComfyUI.zip&#xff0c;官方最新0.3.40&#xff0c;如果后續官方有迭代&#xff0c;可以直接通過git更新源碼升級 comfyui插件下載&#xff0c;解壓放到custom_nodes目錄下&#xff0c;包含 comfyui-animatediff-evolved&#xff08;視頻插件&#xff09; 和…

面試題SpringCloud

SpringCloud有哪些特征&#xff1f; 分布式/版本化配置服務注冊與發現路由服務到服務的調用負載均衡斷路器領導選舉和集群狀態分布式消息傳遞 SpringCloud核心組件&#xff1f; Eureka 注冊中心Ribbon 客戶端負載均衡Hystrix&#xff1a; 服務容錯處理Feign:聲明式Rest客戶端Zu…

ASR-PRO語音識別可能出現的問題

ASR-PRO語音識別可能出現的問題 4月份有一天刷到牢大/愛麗絲語音自開關燈設備&#xff0c;心血來潮&#xff0c;博主也是淺嘗了一下&#xff0c;由此也總結一下&#xff0c;實現此項目會出現的問題。 在實現愛麗絲開關燈模塊時ASRPRO語音識別可能出現的問題如下&#xff1a; …

蒼穹外賣--緩存菜品Spring Cache

Spring Cache是一個框架&#xff0c;實現了基于注解的緩存功能&#xff0c;只需要簡單地加一個注解&#xff0c;就能實現緩存功能。 Spring Cache提供了一層抽象&#xff0c;底層可以切換不同的緩存實現&#xff0c;例如&#xff1a; ①EHCache ②Caffeine ③Redis 常用注解…

個人簡歷制作MarkDown模板

MarkDown制作個人簡歷的模板放在了github上&#xff0c;大家如有需求&#xff0c;請自取&#xff1a; https://github.com/QQQQQQBY/ResumeTemplate 介紹一下此模板的特點&#xff1a; &#x1f338;個人面試期間使用的、整理的簡歷格式&#xff0c;現在分享給大家。 ?簡歷采…