一文帶你掌握Vue?Router4進行頁面跳轉(zhuǎn)處理
朋友們,你們有沒有在開發(fā)Vue應(yīng)用時,對著頁面跳轉(zhuǎn)和權(quán)限管理頭疼過?手動拼接URL?自己處理前進后退?用戶沒登錄也能進入管理后臺?別擔(dān)心,今天我們就來徹底搞定Vue Router 4。
Vue Router是Vue.js官方的路由管理器,它能讓你用組件化的思維來管理你的頁面和視圖。說白了,就是讓你的單頁面應(yīng)用看起來像是有很多個“頁面”一樣,并且能無縫地在它們之間跳轉(zhuǎn)。從基礎(chǔ)的路徑配置到高級的導(dǎo)航守衛(wèi),這篇文章會帶你從零開始,快速上手。相信我,學(xué)完它,你的開發(fā)體驗會順暢得多。
先讓你的項目“動”起來:安裝與基礎(chǔ)配置
第一步,我們得把它請進項目里。打開你的終端,在你Vue項目的根目錄下,運行這條命令。假設(shè)你用的是Vue 3項目。
npm install vue-router@4
安裝好了,我們就來創(chuàng)建路由的核心——路由實例。通常,我們會在一個單獨的src/router/index.js文件中做這件事。跟著下面的代碼走一遍,你就明白了。
// src/router/index.js
// 1. 導(dǎo)入必要的函數(shù)和組件
import { createRouter, createWebHistory } from 'vue-router'
// 2. 導(dǎo)入你希望成為“頁面”的Vue組件
import HomeView from '../views/HomeView.vue'
import AboutView from '../views/AboutView.vue'
// 3. 定義路由規(guī)則數(shù)組
const routes = [
{
path: '/', // 當(dāng)瀏覽器地址是根路徑時
name: 'home', // 給路由起個名字,方便跳轉(zhuǎn)
component: HomeView // 顯示HomeView這個組件
},
{
path: '/about',
name: 'about',
component: AboutView
}
]
// 4. 創(chuàng)建路由實例
const router = createRouter({
// 使用HTML5的歷史模式,URL看起來更干凈(比如 /about)
// 另一種模式是 createWebHashHistory,URL會帶#號
history: createWebHistory(),
routes // 簡寫,等同于 routes: routes
})
// 5. 導(dǎo)出這個實例,在main.js中會用到
export default router
創(chuàng)建好路由實例后,我們需要告訴Vue應(yīng)用去使用它。找到你的應(yīng)用入口文件src/main.js,像下面這樣修改。
// src/main.js
import { createApp } from 'vue'
import App from './App.vue'
// 導(dǎo)入我們剛才創(chuàng)建的路由實例
import router from './router'
const app = createApp(App)
// 使用路由插件
app.use(router)
app.mount('#app')
最后一步,我們得在根組件App.vue里放一個“插座”,路由匹配到的組件就會在這個“插座”里顯示出來。
<!-- src/App.vue -->
<template>
<div id="app">
<nav>
<!-- 使用 router-link 組件進行導(dǎo)航,它會被渲染成一個 <a> 標簽 -->
<router-link to="/">首頁</router-link> |
<router-link to="/about">關(guān)于</router-link>
</nav>
<!-- 路由匹配到的組件將在這里被渲染,這就是那個“插座” -->
<router-view />
</div>
</template>
好了!現(xiàn)在運行你的項目,點擊“首頁”和“關(guān)于”,你應(yīng)該能看到頁面內(nèi)容在<router-view />的位置切換了,而瀏覽器地址欄的URL也會跟著變化。恭喜,你的第一個帶路由的Vue應(yīng)用跑通了!
進階導(dǎo)航:如何在不同頁面間穿梭
光能顯示頁面還不夠,我們常常需要在代碼里控制跳轉(zhuǎn),比如登錄成功后自動跳轉(zhuǎn)到主頁。有兩種主要方式。
第一種,聲明式導(dǎo)航。就像上面的例子,我們用<router-link>標簽。它比用<a href="...">好在,它是在單頁面應(yīng)用內(nèi)部跳轉(zhuǎn),不會真的向服務(wù)器重新加載頁面,速度飛快。
<template>
<!-- 使用‘to'屬性指定目標地址,可以是字符串路徑,也可以是路由對象 -->
<router-link to="/about">去關(guān)于頁面</router-link>
<!-- 更推薦使用命名路由,這樣即使你改了path路徑,這里的鏈接也不用改 -->
<router-link :to="{ name: 'home' }">返回首頁</router-link>
<!-- 甚至可以帶參數(shù) -->
<router-link :to="{ name: 'user', params: { id: 123 } }">查看用戶123</router-link>
</template>
第二種,編程式導(dǎo)航。在你的組件方法里,通過this.$router(在組合式API中是useRouter())來跳轉(zhuǎn)。這給了你最大的靈活性。
<script>
// 選項式 API 寫法
export default {
methods: {
goToAboutPage() {
// 和 router-link 的 `to` 屬性一樣,可以接受路徑或路由對象
this.$router.push('/about')
// 或者
this.$router.push({ name: 'about' })
},
goBack() {
// 返回上一頁,相當(dāng)于瀏覽器的后退按鈕
this.$router.back()
},
replaceHome() {
// 用‘替換'的方式跳轉(zhuǎn),不會在歷史記錄里留下當(dāng)前頁
this.$router.replace({ name: 'home' })
}
}
}
</script>
<script setup>
// 組合式 API 寫法(現(xiàn)在更常用)
import { useRouter } from 'vue-router'
const router = useRouter()
const goToAboutPage = () => {
router.push('/about')
}
const goBack = () => {
router.back()
}
</script>
讓路由活起來:動態(tài)路由與參數(shù)傳遞
很多時候,我們的路徑不是固定的,比如用戶詳情頁/user/1和/user/2。這就需要動態(tài)路由。
// 在路由規(guī)則中,用冒號 : 來標記動態(tài)部分
const routes = [
{
path: '/user/:id', // `:id`就是一個動態(tài)參數(shù)
name: 'user',
component: UserView
}
]
在目標組件UserView.vue里,我們怎么拿到這個id呢?通過useRoute()這個函數(shù)。
<!-- src/views/UserView.vue -->
<template>
<div>
<h2>用戶詳情頁</h2>
<!-- 在模板中直接使用 -->
<p>當(dāng)前用戶ID是:{{ $route.params.id }}</p>
<p>另一種方式獲得的ID:{{ userId }}</p>
</div>
</template>
<script setup>
import { useRoute } from 'vue-router'
import { computed } from 'vue'
// 使用 useRoute() 獲取當(dāng)前路由信息
const route = useRoute()
// 動態(tài)參數(shù)是響應(yīng)式的,我們可以用計算屬性來獲取
const userId = computed(() => route.params.id)
// 你也可以通過 route.query 獲取查詢參數(shù)
// 比如 /user/123?name=zhangsan,則 route.query.name 為 ‘zhangsan'
const userName = computed(() => route.query.name)
</script>
除了通過URL(params, query)傳遞參數(shù),你還可以用props傳參,讓組件更干凈。
// 在路由規(guī)則中開啟 props 傳參
const routes = [
{
path: '/user/:id',
name: 'user',
component: UserView,
props: true // 將 route.params 作為組件的 props 傳入
// 或者使用函數(shù)模式,實現(xiàn)更靈活的控制
// props: (route) => ({ id: Number(route.params.id) })
}
]
然后你的組件就可以像接收普通props一樣接收它了。
<!-- src/views/UserView.vue -->
<script setup>
// 直接定義 props
defineProps({
id: {
type: [String, Number],
required: true
}
})
</script>
<template>
<div>用戶ID是:{{ id }}</div>
</template>
項目的“守門神”:路由守衛(wèi)深度解析
重頭戲來了!路由守衛(wèi)是Vue Router里非常強大的一環(huán),它允許你在導(dǎo)航發(fā)生前、發(fā)生后進行攔截或處理。最常見的場景就是:檢查用戶是否登錄。
全局前置守衛(wèi)router.beforeEach:這是最常用的守衛(wèi),在每一次導(dǎo)航開始時觸發(fā)。我們可以在這里做權(quán)限檢查。
// 回到你的 src/router/index.js
// 在創(chuàng)建并導(dǎo)出 router 實例之后,可以添加守衛(wèi)
// ... createRouter 代碼 ...
// 添加全局前置守衛(wèi)
router.beforeEach((to, from, next) => {
// to: 即將要進入的目標路由對象
// from: 當(dāng)前導(dǎo)航正要離開的路由對象
// next: 一個函數(shù),必須調(diào)用它來解析這個守衛(wèi)
// 假設(shè)我們有一個簡單的登錄檢查
const isAuthenticated = localStorage.getItem('token') // 從本地存儲讀取token
// 如果用戶想去一個需要登錄的頁面(比如頁面元信息里標記了 requiresAuth: true)
if (to.meta.requiresAuth && !isAuthenticated) {
// 把他重定向到登錄頁
next({
name: 'login',
// 可以附帶一個查詢參數(shù),記錄他原本想去哪里,登錄后直接跳過去
query: { redirect: to.fullPath }
})
} else {
// 放行,去往目標頁面
next()
}
})
路由獨享的守衛(wèi)beforeEnter:你可以只為某一條路由規(guī)則定義守衛(wèi),它只在進入該路由時觸發(fā)。
const routes = [
{
path: '/admin',
name: 'admin',
component: AdminView,
meta: { requiresAdmin: true }, // 自定義元信息,標記需要管理員權(quán)限
beforeEnter: (to, from, next) => {
const userRole = getUserRoleSomehow() // 假設(shè)有個獲取用戶角色的方法
if (userRole === 'admin') {
next() // 是管理員,允許進入
} else {
next({ name: 'forbidden' }) // 不是管理員,跳轉(zhuǎn)到無權(quán)限頁面
}
}
}
]
組件內(nèi)的守衛(wèi):你還可以在組件內(nèi)部定義守衛(wèi)。
onBeforeRouteUpdate:當(dāng)前組件復(fù)用時(僅參數(shù)變化)調(diào)用,非常適合用來根據(jù)新參數(shù)獲取數(shù)據(jù)。onBeforeRouteLeave:離開該組件時調(diào)用,可以用來防止用戶在編輯表單時誤操作離開。
<script setup>
import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
// 守衛(wèi)1:離開組件前提示用戶
onBeforeRouteLeave((to, from) => {
const answer = window.confirm('你有未保存的更改,確定要離開嗎?')
// 如果用戶取消,就取消這次導(dǎo)航
if (!answer) return false
})
// 守衛(wèi)2:當(dāng)路由更新(比如從 /user/1 跳轉(zhuǎn)到 /user/2)時,重新獲取數(shù)據(jù)
import { fetchUserData } from '@/api'
onBeforeRouteUpdate(async (to) => {
// 組件實例復(fù)用,但參數(shù)從 1 變成了 2
// 在這里用新的參數(shù) to.params.id 重新獲取用戶數(shù)據(jù)
await fetchUserData(to.params.id)
})
</script>
最后:幾條讓你走得更遠的實戰(zhàn)建議
看到這里,你已經(jīng)掌握了Vue Router 4的核心技能。為了讓你的項目結(jié)構(gòu)更清晰、代碼更健壯,這里還有幾個小貼士:
用好路由元信息meta字段:這個字段就像給你的路由貼標簽,非常適合在全局守衛(wèi)里做統(tǒng)一的權(quán)限判斷,或者在生成導(dǎo)航菜單時標記是否需要顯示。
考慮路由懶加載:當(dāng)你的應(yīng)用頁面很多時,把所有組件的代碼打包到一個文件里會讓首次加載很慢。路由懶加載可以讓你在訪問某個頁面時才去加載它的代碼,大幅提升首屏速度。
const routes = [
{
path: '/about',
name: 'about',
// 使用動態(tài) import 語法,Webpack/Vite會自動進行代碼分割
component: () => import('../views/AboutView.vue')
}
]
處理好404頁面:在路由規(guī)則的最后,添加一個通配符*的路由,來捕獲所有未匹配的路徑,展示一個友好的404頁面。
const routes = [
// ... 你的其他路由 ...
{
path: '/:pathMatch(.*)*', // 這是Vue Router 4的捕獲所有路由的寫法
name: 'not-found',
component: () => import('../views/NotFoundView.vue')
}
]
好了,我們從最基礎(chǔ)的安裝配置,一路聊到了動態(tài)參數(shù)和強大的路由守衛(wèi)?,F(xiàn)在回頭看看,頁面跳轉(zhuǎn)、權(quán)限控制這些讓人頭疼的問題,是不是都有了清晰的解決思路?
關(guān)鍵在于動手去試。創(chuàng)建一個新項目,把這些代碼示例都敲一遍,再試著結(jié)合你的實際業(yè)務(wù)(比如從后端API獲取用戶權(quán)限,動態(tài)生成路由),你就能真正駕馭Vue Router,讓它成為你構(gòu)建復(fù)雜單頁面應(yīng)用的得力助手。別再手動處理那些繁瑣的導(dǎo)航邏輯了,讓Vue Router來幫你,效率提升真的不止一點點。
到此這篇關(guān)于一文帶你掌握Vue Router4進行頁面跳轉(zhuǎn)處理的文章就介紹到這了,更多相關(guān)Vue Router頁面跳轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Vue中mounted鉤子函數(shù)獲取節(jié)點高度出錯問題
本篇文章給大家分享了如何解決Vue中mounted鉤子函數(shù)獲取節(jié)點高度出錯問題,對此有興趣的朋友可以參考學(xué)習(xí)下。2018-05-05
VuePress 靜態(tài)網(wǎng)站生成方法步驟
這篇文章主要介紹了VuePress 靜態(tài)網(wǎng)站生成方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
解決Vue中使用Echarts出現(xiàn)There?is?a?chart?instance?already?ini
使用echarts的時候,多次加載會出現(xiàn)There?is?a?chart?instance?already?initialized?on?the?dom.這個黃色警告,此警告信息不影響echarts正常加載,但是有bug得解決,本文就帶大家解決這個問題,感興趣的同學(xué)可以參考閱讀2023-06-06
vxe-table?實現(xiàn)按回車鍵自動新增一行(示例代碼)
本文通過示例代碼介紹了vxe-table新版本中實現(xiàn)回車自動換行功能的方法,通過設(shè)置keyboard-config.isLastEnterAppendRow參數(shù)可以控制是否開啟該功能,當(dāng)回車鍵在最后一行按下時,會自動新增一行,并將光標移動到新行,代碼簡單易懂,感興趣的朋友跟隨小編一起看看吧2024-12-12

