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也能收到 })
我的實(shí)戰(zhàn)經(jīng)驗(yàn):當(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實(shí)際上是存儲在內(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就是個老實(shí)人:
// 路由配置 { 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解耦
實(shí)在被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)點(diǎn):
- 解耦路由參數(shù)
- 類型檢查更方便
- 復(fù)用組件更靈活
六、小楊的傳參黃金法則
敏感數(shù)據(jù)走params:比如用戶ID、token等
分享鏈接用query:搜索條件、分頁參數(shù)等
復(fù)雜場景用props:結(jié)合兩者優(yōu)點(diǎn)
重要提示:
- 永遠(yuǎn)不要相信params在刷新后還存在
- 關(guān)鍵參數(shù)一定要有URL備份
- 測試時務(wù)必檢查刷新后的表現(xiàn)
最后送大家一個參數(shù)校驗(yà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)庫使用,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11vuex之this.$store.dispatch()與this.$store.commit()的區(qū)別及說明
這篇文章主要介紹了vuex之this.$store.dispatch()與this.$store.commit()的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06vue+element實(shí)現(xiàn)批量刪除功能的示例
下面小編就為大家分享一篇vue+element實(shí)現(xiàn)批量刪除功能的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02vue3+el-table實(shí)現(xiàn)行列轉(zhuǎn)換
在處理文本數(shù)據(jù)的時候,我們經(jīng)常會需要把文本數(shù)據(jù)的行與列進(jìn)行轉(zhuǎn)換操作,這樣更方便查看,本文就詳細(xì)的介紹了vue3+el-table實(shí)現(xiàn)行列轉(zhuǎn)換,感興趣的可以了解一下2021-06-06