Vue3項目中多頁面路由配置與Pinia狀態(tài)管理的完全指南
在 Vue 3 項目開發(fā)中,多頁面路由是構建單頁應用(SPA)的核心骨架,而 Pinia 狀態(tài)管理則是解決組件間數(shù)據共享的利器。本文將從實戰(zhàn)角度出發(fā),一步步帶你配置首頁、列表頁、詳情頁的路由,實現(xiàn)頁面導航與參數(shù)傳遞,并結合 Pinia 管理用戶登錄狀態(tài)、用戶信息,同時實現(xiàn)狀態(tài)持久化,配合清晰的圖解,讓你輕松掌握 Vue 3 開發(fā)的核心技能。
一、開發(fā)多頁面應用:Vue Router 4 實戰(zhàn)
Vue Router 4 是 Vue 3 的官方路由管理器,通過它我們可以輕松實現(xiàn)頁面間的切換、參數(shù)傳遞等功能。
1.1 安裝與基礎配置
首先,在 Vue 3 項目中安裝 Vue Router 4:
npm install vue-router@4
接下來,創(chuàng)建路由配置文件 src/router/index.js:
import { createRouter, createWebHistory } from 'vue-router'
// 引入頁面組件
import Home from '@/views/Home.vue'
import List from '@/views/List.vue'
import Detail from '@/views/Detail.vue'
// 定義路由規(guī)則
const routes = [
{
path: '/',
name: 'Home',
component: Home // 首頁
},
{
path: '/list',
name: 'List',
component: List // 列表頁
},
{
path: '/detail/:id', // 動態(tài)路由,:id 為參數(shù)占位符
name: 'Detail',
component: Detail // 詳情頁
}
]
// 創(chuàng)建路由實例
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL), // 使用 HTML5 History 模式
routes
})
export default router然后在 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')最后,在 App.vue 中添加路由出口 <router-view>:
<template>
<div id="app">
<!-- 路由出口,匹配到的頁面組件會渲染在這里 -->
<router-view></router-view>
</div>
</template>1.2 配置首頁、列表頁、詳情頁組件
我們先創(chuàng)建三個基礎頁面組件:
1.2.1 首頁 (src/views/Home.vue)
<template>
<div class="home">
<h1>首頁</h1>
<p>歡迎來到 Vue 3 多頁面應用!</p>
<!-- 使用 router-link 進行聲明式導航 -->
<router-link to="/list">跳轉到列表頁</router-link>
</div>
</template>
<style scoped>
.home { padding: 20px; }
</style>1.2.2 列表頁 (src/views/List.vue)
<template>
<div class="list">
<h1>列表頁</h1>
<ul>
<!-- 模擬列表數(shù)據 -->
<li v-for="item in list" :key="item.id">
<!-- 跳轉到詳情頁,傳遞 id 參數(shù) -->
<router-link :to="`/detail/${item.id}`">{{ item.title }}</router-link>
</li>
</ul>
<router-link to="/">返回首頁</router-link>
</div>
</template>
<script setup>
import { ref } from 'vue'
// 模擬列表數(shù)據
const list = ref([
{ id: 1, title: '文章一:Vue Router 入門' },
{ id: 2, title: '文章二:Pinia 狀態(tài)管理' },
{ id: 3, title: '文章三:Vue 3 組合式 API' }
])
</script>
<style scoped>
.list { padding: 20px; }
li { margin: 10px 0; }
</style>1.2.3 詳情頁 (src/views/Detail.vue)
<template>
<div class="detail">
<h1>詳情頁</h1>
<p>當前文章 ID:{{ articleId }}</p>
<p>文章標題:{{ articleTitle }}</p>
<!-- 編程式導航返回列表頁 -->
<button @click="goBack">返回列表頁</button>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router' // 引入路由鉤子
const route = useRoute() // 獲取當前路由信息
const router = useRouter() // 獲取路由實例,用于編程式導航
const articleId = ref('')
const articleTitle = ref('')
// 模擬文章數(shù)據
const articles = {
1: '文章一:Vue Router 入門',
2: '文章二:Pinia 狀態(tài)管理',
3: '文章三:Vue 3 組合式 API'
}
onMounted(() => {
// 接收動態(tài)路由參數(shù) :id
articleId.value = route.params.id
articleTitle.value = articles[articleId.value] || '文章不存在'
})
// 編程式導航返回列表頁
const goBack = () => {
router.push('/list')
}
</script>
<style scoped>
.detail { padding: 20px; }
</style>1.3 頁面導航與參數(shù)傳遞詳解
1.3.1 兩種導航方式
- 聲明式導航:使用
<router-link>組件,通過to屬性指定目標路徑,適合在模板中直接使用。 - 編程式導航:使用
useRouter鉤子獲取路由實例,調用router.push()、router.replace()等方法,適合在邏輯代碼中使用。
1.3.2 兩種參數(shù)傳遞方式
表格
| 方式 | 寫法 | 接收方式 | 刷新頁面 | 示例 |
|---|---|---|---|---|
| 動態(tài)路由參數(shù) | path: '/detail/:id',跳轉:/detail/1 | route.params.id | 參數(shù)保留 | 詳情頁 ID |
| Query 參數(shù) | 跳轉:/detail?id=1 | route.query.id | 參數(shù)保留 | 搜索關鍵詞 |
注意:如果使用 name 配合 params 跳轉(如 router.push({ name: 'Detail', params: { id: 1 } })),刷新頁面后參數(shù)會丟失,建議優(yōu)先使用動態(tài)路由參數(shù)或 Query 參數(shù)。
1.4 路由導航流程圖解

二、Pinia 狀態(tài)管理:用戶登錄與持久化
Pinia 是 Vue 3 的官方狀態(tài)管理庫,相比 Vuex 更簡潔、更符合組合式 API 的設計理念,支持 TypeScript,且 DevTools 支持更好。
2.1 Pinia 安裝與注冊
首先安裝 Pinia 和持久化插件(用于狀態(tài)刷新不丟失):
npm install pinia npm install pinia-plugin-persistedstate
然后在 main.js 中注冊 Pinia 和持久化插件:
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import { createPinia } from 'pinia' // 引入 Pinia
import piniaPersistedstate from 'pinia-plugin-persistedstate' // 引入持久化插件
const app = createApp(App)
const pinia = createPinia() // 創(chuàng)建 Pinia 實例
pinia.use(piniaPersistedstate) // 注冊持久化插件
app.use(router)
app.use(pinia) // 注冊 Pinia
app.mount('#app')2.2 創(chuàng)建 User Store(用戶狀態(tài)管理)
創(chuàng)建 src/store/user.js,用于管理登錄狀態(tài)和用戶信息:
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
// 定義 User Store
export const useUserStore = defineStore('user', () => {
// 1. State:響應式數(shù)據
const token = ref('') // 登錄 Token
const userInfo = ref({}) // 用戶信息
// 2. Getters:計算屬性(可選,用于派生狀態(tài))
const isLoggedIn = computed(() => !!token.value) // 是否登錄
// 3. Actions:修改狀態(tài)的方法
// 登錄:保存 Token 和用戶信息
const login = (newToken, newUserInfo) => {
token.value = newToken
userInfo.value = newUserInfo
}
// 登出:清空狀態(tài)
const logout = () => {
token.value = ''
userInfo.value = {}
}
// 更新用戶信息
const updateUserInfo = (newInfo) => {
userInfo.value = { ...userInfo.value, ...newInfo }
}
// 返回 state、getters、actions
return {
token,
userInfo,
isLoggedIn,
login,
logout,
updateUserInfo
}
}, {
// 4. 持久化配置
persist: {
key: 'user-store', // 存儲在 localStorage 中的 key
storage: localStorage, // 存儲方式:localStorage 或 sessionStorage
paths: ['token', 'userInfo'] // 指定需要持久化的 state,默認全部
}
})
2.3 在組件中使用 User Store
我們修改之前的頁面,加入登錄、顯示用戶信息、登出功能:
2.3.1 新增登錄頁 (src/views/Login.vue)
先在路由配置中添加登錄頁路由:
// src/router/index.js
const routes = [
// ... 之前的路由
{
path: '/login',
name: 'Login',
component: () => import('@/views/Login.vue') // 路由懶加載
}
]然后創(chuàng)建登錄頁組件:
<template>
<div class="login">
<h1>登錄頁</h1>
<form @submit.prevent="handleLogin">
<div>
<label>用戶名:</label>
<input v-model="username" placeholder="請輸入用戶名" required />
</div>
<div>
<label>密碼:</label>
<input v-model="password" type="password" placeholder="請輸入密碼" required />
</div>
<button type="submit">登錄</button>
</form>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import { useUserStore } from '@/store/user' // 引入 User Store
const router = useRouter()
const userStore = useUserStore() // 獲取 Store 實例
const username = ref('')
const password = ref('')
// 模擬登錄
const handleLogin = () => {
// 假設登錄成功,返回 Token 和用戶信息
const mockToken = 'mock-token-123456'
const mockUserInfo = {
id: 1,
username: username.value,
avatar: 'https://via.placeholder.com/50'
}
// 調用 Store 的 login 方法
userStore.login(mockToken, mockUserInfo)
// 登錄成功后跳轉到首頁
router.push('/')
}
</script>
<style scoped>
.login { padding: 20px; max-width: 300px; margin: 0 auto; }
div { margin: 10px 0; }
input { width: 100%; padding: 8px; box-sizing: border-box; }
button { width: 100%; padding: 10px; background: #42b883; color: white; border: none; cursor: pointer; }
</style>2.3.2 修改首頁 (src/views/Home.vue),顯示用戶信息
<template>
<div class="home">
<h1>首頁</h1>
<!-- 根據登錄狀態(tài)顯示不同內容 -->
<div v-if="userStore.isLoggedIn">
<p>歡迎你,{{ userStore.userInfo.username }}!</p>
<img :src="userStore.userInfo.avatar" alt="頭像" style="width: 50px; height: 50px; border-radius: 50%;" />
<button @click="handleLogout">登出</button>
</div>
<div v-else>
<p>你還未登錄,請先登錄。</p>
<router-link to="/login">去登錄</router-link>
</div>
<router-link to="/list">跳轉到列表頁</router-link>
</div>
</template>
<script setup>
import { useUserStore } from '@/store/user'
import { useRouter } from 'vue-router'
const userStore = useUserStore()
const router = useRouter()
// 登出
const handleLogout = () => {
userStore.logout()
router.push('/login')
}
</script>
<style scoped>
.home { padding: 20px; }
</style>2.4 Pinia 狀態(tài)管理流程圖解

三、總結與最佳實踐
3.1 路由配置最佳實踐
- 路由懶加載:使用
() => import('@/views/xxx.vue')實現(xiàn)路由懶加載,減小首屏包體積。 - 動態(tài)路由參數(shù):優(yōu)先使用動態(tài)路由參數(shù)(如
/detail/:id)傳遞關鍵數(shù)據,刷新頁面不丟失。 - 路由守衛(wèi):可添加全局前置守衛(wèi)
router.beforeEach實現(xiàn)登錄攔截(如未登錄跳轉到登錄頁)。
3.2 Pinia 使用最佳實踐
- 模塊化 Store:按功能劃分 Store(如
user.js、cart.js),避免單個 Store 過大。 - 組合式 API 寫法:使用
defineStore的函數(shù)式寫法(而非對象式),更符合 Vue 3 的設計理念。 - 持久化插件:合理使用
pinia-plugin-persistedstate,只持久化必要的 state(如 Token、用戶信息),避免存儲敏感數(shù)據。
以上就是Vue3項目中多頁面路由配置與Pinia狀態(tài)管理的完全指南的詳細內容,更多關于Vue3多頁面路由配置與Pinia狀態(tài)管理的資料請關注腳本之家其它相關文章!
相關文章
Vue3中ref數(shù)組的監(jiān)聽實現(xiàn)方式
Vue3中監(jiān)聽ref定義的數(shù)組,需根據監(jiān)聽需求選擇合適的監(jiān)聽方法,對于空數(shù)組,推薦使用深度監(jiān)聽來捕捉數(shù)組內部變化,同時,確保修改數(shù)組的方式是響應式的,以保證監(jiān)聽器能正常工作,根據具體需求,可以選擇直接深度監(jiān)聽、監(jiān)聽數(shù)組長度變化或提取屬性監(jiān)聽等方案2025-10-10
vue?element表格某一列內容過多,超出省略號顯示的實現(xiàn)
這篇文章主要介紹了vue?element表格某一列內容過多,超出省略號顯示的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01

