Vue路由參數(shù)的傳遞與獲取方式詳細介紹
前言
vue 頁面路由切換時傳參的方式有如下幾種:
動態(tài)路由參數(shù)
- 它隱藏字段信息,相對于來說較安全,同時地址欄中的地址也相對較短
- 它必須是先定義后使用,一般用于根據(jù)固定參數(shù),返回對應(yīng)的數(shù)據(jù)所用
query字符串 ?id=1
通過search字符串的方式來在地址欄中傳遞數(shù)據(jù),相對于來說地址欄會暴露字段信息安全性較低,一般用于搜索相關(guān),它可以不定義就可以直接用
props 隱式傳遞
隱式傳遞,它一般用于敏感數(shù)據(jù)的傳遞,可以不用
cookie/storage來完成對于頁面?zhèn)鲄?/p>
1. 通過動態(tài)路由參數(shù)傳遞
描述:
當(dāng)我們確定了某一個頁面需要根據(jù)唯一標(biāo)識來獲取詳情的時候,我們一般使用動態(tài)路由傳遞參數(shù)。
要注意,通過這種方式傳遞數(shù)據(jù),動態(tài)路由必須先定義后使用,并且獲取數(shù)據(jù)時需要唯一標(biāo)識。
使用:
news.js(這個文件是從 index.js 文件中抽取拆分出來的,最終要被引入到 insex.js 文件中):
import News from '@/views/News'
import Detail from '@/views/Detail'
const routes = [
{
path: '/news',
component: News,
},
{
// 通過動態(tài)路由參數(shù)來完成頁面數(shù)據(jù)的傳遞
path: '/news/:id',
component: Detail,
},
]
export default routes
index.js:
import Vue from 'vue'
import VueRouter from 'vue-router'
import news from './routes/news'
// 以插件的方式添加
Vue.use(VueRouter)
// 實例化路由對象及配置路由表
const routes = [...news]
const router = new VueRouter({
// 路由模式
mode: 'history',
// 路由規(guī)則表
routes
})
export default router
new.json(虛擬新聞 mooc 數(shù)據(jù)):
[
{ "id": 1000, "title": "新聞1" },
{ "id": 2000, "title": "新聞2" },
{ "id": 3000, "title": "新聞3" }
]
new.vue(新聞頁):
<template>
<div>
<ul>
<template v-if="news == null">
<li>加載中...</li>
</template>
<template v-else>
<li @click="godetail(item.id)" v-for="item in news" :key="item.id">{{ item.title }}</li>
</template>
</ul>
</div>
</template>
<script>
import { get } from '@/utils/http'
export default {
data() {
return {
news: null
}
},
async created() {
let ret = await get('/mock/news.json')
this.news = ret
},
methods: {
godetail(id) {
this.$router.push(`/news/${id}`)
}
}
}
</script>
<style lang="scss" scoped></style>detail.vue(新聞詳情頁):
<template>
<div>
</div>
</template>
<script>
export default {
mounted() {
// 獲取動態(tài)路由參數(shù)數(shù)據(jù)
console.log(this.$route.params)
}
}
</script>
<style lang="scss" scoped></style>
2. 通過query字符串傳遞
new.vue(新聞頁):
<template>
<div>
<ul>
<template v-if="news == null">
<li>加載中...</li>
</template>
<template v-else>
<li @click="godetail(item.id)" v-for="item in news" :key="item.id">{{ item.title }}</li>
</template>
</ul>
</div>
</template>
<script>
import { get } from '@/utils/http'
export default {
data() {
return {
news: null
}
},
async created() {
let ret = await get('/mock/news.json')
this.news = ret
},
methods: {
godetail(id) {
this.$router.push(`/news/${id}?kw=abc`)
}
}
}
</script>
<style lang="scss" scoped></style>detail.vue(新聞詳情頁):
<template>
<div>
</div>
</template>
<script>
export default {
mounted() {
// 獲取query字符串
console.log(this.$route.query)
}
}
</script>
<style lang="scss" scoped></style>

3. props 隱式傳遞
news.js:
import News from '@/views/News'
import Detail from '@/views/Detail'
const routes = [
{
path: '/news',
component: News,
},
{
// 通過動態(tài)路由參數(shù)來完成頁面數(shù)據(jù)的傳遞
path: '/news/:id',
component: Detail,
// 寫法1:回調(diào)函數(shù)寫法,可以書寫業(yè)務(wù)邏輯
// router它就是一個路由對象
props: router => {
let title = router.params.id == '1000' ? '爆炸新聞' : '一般新聞'
return {
state: 2000,
title
}
},
// 寫法2:這是一種沒什么用的寫法,沒有業(yè)務(wù)邏輯
// props: { title: '1', state: 2 }
}
]
export default routesnew.vue(新聞頁):
<template>
<div>
<ul>
<template v-if="news == null">
<li>加載中...</li>
</template>
<template v-else>
<li @click="godetail(item.id)" v-for="item in news" :key="item.id">{{ item.title }}</li>
</template>
</ul>
</div>
</template>
<script>
import { get } from '@/utils/http'
export default {
data() {
return {
news: null
}
},
async created() {
let ret = await get('/mock/news.json')
this.news = ret
},
methods: {
godetail(id) {
this.$router.push(`/news/${id}?kw=abc`)
}
}
}
</script>
<style lang="scss" scoped></style>detail.vue(新聞詳情頁):
<template>
<div>
<h3>props: {{ state }} -- {{ title }}</h3>
</div>
</template>
<script>
export default {
props: ['state','title'],
}
</script>
<style lang="scss" scoped></style>
這種傳遞方式,可以敏感字段從地址欄中隱藏,不會暴露數(shù)據(jù),而且回調(diào)函數(shù)的寫法可以書寫業(yè)務(wù)邏輯。
這種方式可以做數(shù)據(jù)埋點(也叫用戶指紋),即隱蔽地收集用戶數(shù)據(jù)。用戶每次跳轉(zhuǎn)頁面都會觸發(fā) props 隱式傳遞,從而做到用戶數(shù)據(jù)的收集。收集到數(shù)據(jù)后,通過python、大數(shù)據(jù)等技術(shù),為用戶建模,生成人物畫像,由此可以進行大數(shù)據(jù)推薦。
除了上面兩種寫法以外,還有第三種寫法
news.js:
import News from '@/views/News'
import Detail from '@/views/Detail'
const routes = [
{
path: '/news',
component: News,
},
{
// 通過動態(tài)路由參數(shù)來完成頁面數(shù)據(jù)的傳遞
path: '/news/:id',
component: Detail,
// 寫法3:布爾類型
// 布爾類型,一但使用,params動態(tài)路由參數(shù)傳的數(shù)據(jù),可以通過props來獲取
// 設(shè)置為布爾類型,可以簡化,動態(tài)路由參數(shù)的數(shù)據(jù)獲取
props: true,
}
]
export default routesdetail.vue(新聞詳情頁):
<template>
<div>
<!-- 直接通過 props 獲取動態(tài)路由參數(shù) -->
<h3>props: {{ $route.params }} -- {{ id }}</h3>
</div>
</template>
<script>
export default {
props: ["id"],
};
</script>
<style lang="scss" scoped></style>
到此這篇關(guān)于Vue路由參數(shù)的傳遞與獲取方式詳細介紹的文章就介紹到這了,更多相關(guān)Vue路由傳參內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue在install時node-sass@4.14.1?postinstall:node?scripts/buil
最近在npm install 的時候遇到了個問題,所以給大家總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于vue在install時node-sass@4.14.1?postinstall:node?scripts/build.js錯誤的解決方法,需要的朋友可以參考下2023-05-05
Vue3.0 響應(yīng)式系統(tǒng)源碼逐行分析講解
這篇文章主要介紹了Vue3.0 響應(yīng)式系統(tǒng)源碼逐行分析講解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
一文詳解如何在Vue網(wǎng)站中實現(xiàn)多語言支持
在當(dāng)今全球化的互聯(lián)網(wǎng)環(huán)境中,為網(wǎng)站提供多語言支持已成為提升用戶體驗和擴大受眾范圍的關(guān)鍵策略,本文為大家介紹了如何在Vue網(wǎng)站中實現(xiàn)多語種支持功能,有需要的可以了解下2025-03-03
vue集成openlayers加載geojson并實現(xiàn)點擊彈窗教程
這篇文章主要為大家詳細介紹了vue集成openlayers加載geojson并實現(xiàn)點擊彈窗教程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-09-09
Vue父組件向子組件傳值以及data和props的區(qū)別詳解
這篇文章主要介紹了Vue父組件向子組件傳值以及data和props的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
教你如何開發(fā)Vite3插件構(gòu)建Electron開發(fā)環(huán)境
這篇文章主要介紹了如何開發(fā)Vite3插件構(gòu)建Electron開發(fā)環(huán)境,文中給大家提到了如何讓 Vite 加載 Electron 的內(nèi)置模塊和 Node.js 的內(nèi)置模塊,需要的朋友可以參考下2022-11-11
vue通過vue-lazyload實現(xiàn)圖片懶加載的代碼詳解
這篇文章主要給大家介紹了vue通過vue-lazyload實現(xiàn)圖片懶加載,文中通過代碼示例給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02

