Vue路由傳參避坑指南
一、路由傳參的"雙胞胎":params和query
先來看個簡單的對比表格:
| 特性 | params | query |
|---|---|---|
| URL顯示 | 不顯示 | 顯示為?key=value |
| 路由配置 | 需要動態(tài)路由 | 不需要特殊配置 |
| 刷新保留 | 可能丟失 | 始終保留 |
| 適用場景 | 敏感/簡短數(shù)據(jù) | 可分享的公開數(shù)據(jù) |
二、params的"玄學(xué)"生效時刻
1. 生效的情況(正確姿勢)
// 路由配置
{
path: '/user/:userId',
name: 'UserPage',
component: User
}
// 跳轉(zhuǎn)方式1:命名路由+params
this.$router.push({
name: 'UserPage',
params: { userId: '我' } // ? 有效
})
// 跳轉(zhuǎn)方式2:完整path+params
this.$router.push({
path: '/user/我',
params: { age: 18 } // ? age也能收到
})
我的實戰(zhàn)經(jīng)驗:當(dāng)同時滿足這兩個條件時params一定有效:
- 路由配置了動態(tài)參數(shù)(如
:userId) - 使用命名路由(name)跳轉(zhuǎn)
2. 失效的情況(天坑預(yù)警)
// 錯誤示范1:path跳轉(zhuǎn)+params
this.$router.push({
path: '/user',
params: { userId: '我' } // ? 完全丟失
})
// 錯誤示范2:未配置動態(tài)路由
{
path: '/product',
name: 'Product',
component: Product
}
this.$router.push({
name: 'Product',
params: { id: 123 } // ? 刷新后丟失
})
血淚教訓(xùn):params就像個傲嬌的小姑娘,你得完全按照她的規(guī)矩來!
三、為什么params會神秘消失?
1. 刷新丟失的真相
- params實際上是存儲在內(nèi)存中的
- 刷新頁面時內(nèi)存被清空
- 除非參數(shù)是URL的一部分(動態(tài)路由),否則無法恢復(fù)
2. 路徑跳轉(zhuǎn)的陷阱
// 這種寫法params會消失!
this.$router.push({
path: '/user/我', // 雖然URL對了
params: { from: 'home' } // ? from參數(shù)會消失
})
// 正確寫法應(yīng)該這樣
this.$router.push({
name: 'UserPage',
params: {
userId: '我',
from: 'home' // ? 兩個參數(shù)都能收到
}
})
四、query的穩(wěn)定發(fā)揮
對比之下,query就是個老實人:
// 路由配置
{
path: '/search',
component: Search
}
// 跳轉(zhuǎn)方式
this.$router.push({
path: '/search',
query: { keyword: 'Vue教程' } // → /search?keyword=Vue教程
})
// 獲取方式(在任何跳轉(zhuǎn)方式下都有效)
this.$route.query.keyword
我的推薦:需要分享鏈接或者參數(shù)需要持久化時,無腦用query!
五、終極解決方案:props解耦
實在被params搞瘋的話,試試這個終極方案:
// 路由配置
{
path: '/article/:id',
component: Article,
props: route => ({
id: route.params.id,
from: route.query.from
})
}
// 組件內(nèi)
export default {
props: ['id', 'from'] // 像普通props一樣使用
}
優(yōu)點:
- 解耦路由參數(shù)
- 類型檢查更方便
- 復(fù)用組件更靈活
六、小楊的傳參黃金法則
敏感數(shù)據(jù)走params:比如用戶ID、token等
分享鏈接用query:搜索條件、分頁參數(shù)等
復(fù)雜場景用props:結(jié)合兩者優(yōu)點
重要提示:
- 永遠(yuǎn)不要相信params在刷新后還存在
- 關(guān)鍵參數(shù)一定要有URL備份
- 測試時務(wù)必檢查刷新后的表現(xiàn)
最后送大家一個參數(shù)校驗的實用代碼:
router.beforeEach((to, from, next) => {
if (to.name === 'Payment' && !to.params.orderId) {
next({ name: 'Error', query: { msg: '訂單ID缺失' } })
} else {
next()
}
})
今天的路由傳參避坑指南就到這里啦!
寫在最后?
到此這篇關(guān)于Vue路由傳參避坑指南的文章就介紹到這了,更多相關(guān)Vue路由傳參避坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unocss(原子化css)?使用及vue3?+?vite?+?ts講解
這篇文章主要介紹了Unocss(原子化css)使用vue3?+?vite?+?ts的方法,簡單介紹了Unocss使用及圖標(biāo)庫使用,通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
vuex之this.$store.dispatch()與this.$store.commit()的區(qū)別及說明
這篇文章主要介紹了vuex之this.$store.dispatch()與this.$store.commit()的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
vue3+el-table實現(xiàn)行列轉(zhuǎn)換
在處理文本數(shù)據(jù)的時候,我們經(jīng)常會需要把文本數(shù)據(jù)的行與列進(jìn)行轉(zhuǎn)換操作,這樣更方便查看,本文就詳細(xì)的介紹了vue3+el-table實現(xiàn)行列轉(zhuǎn)換,感興趣的可以了解一下2021-06-06

