Vue-Router4路由傳參詳解

路由有兩種跳轉方式:

  • 聲明式導航
  • 編程式導航

這兩種傳參方式一樣腮介,本文只以聲明式舉例纳击,編程式跳轉的push函數(shù)直接取router-linkto屬性值即可秋忙,如:

聲明式寫法

<router-link
  :to="{
    name: 'about',
    query: {
      name: '張三',
      age: 18,
    },
  }"
  >跳轉about界面</router-link
>

編程式寫法push函數(shù)的參數(shù)和router-link的to屬性值一樣

<script setup>
import { useRouter } from "vue-router";
const Router = useRouter();
// 路由跳轉點擊方法
const toAbout = () => {
  Router.push({
    name: "about",
    query: {
      name: "張三",
      age: 18,
    },
  });
};
</script>

一、路徑拼接傳參如: ?name=張三&age=18

<router-link to="/about?name=張三&age=18">跳轉about界面</router-link>
<script setup>
import { useRoute } from "vue-router";
const route = useRoute();

console.log(route.query.name); // 張三
console.log(route.query.age); // 18
</script>

<template>
  <h1>姓名:{{ route.query.name }}</h1>
  <h1>年齡:{{ route.query.age }}</h1>
</template>
image.png

二柔昼、動態(tài)路由傳參

about路由后面拼接/:name/:age定義傳參屬性nameage

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    // about
    {
      path: "/about/:name/:age", // /:name/:age定義傳參屬性name和age
      component: import("../views/about/index.vue"),
      props: (route) => {
        console.log(route); //route 跳轉的路由信息
        return route.params;
      },
    },
  ],
});
<router-link to="/about/張三/18">跳轉about界面</router-link>
<script setup>
import { useRoute } from "vue-router";
const route = useRoute();

console.log(route.params.name); // 張三
console.log(route.params.age); // 18
</script>

<template>
  <h1>姓名:{{ route.params.name }}</h1>
  <h1>年齡:{{ route.params.age }}</h1>
</template>

image.png

三馍乙、路由props屬性傳參

3.1. props為布爾值true

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    // about
    {
      path: "/about/:name/:age", // /:name/:age定義傳參屬性name和age
      component: import("../views/about/index.vue"),
      props: true,
    },
  ],
});
<router-link to="/about/張三/18">跳轉about界面</router-link>
<script setup>
import { useRoute } from "vue-router";
const route = useRoute();
const props = defineProps(["name", "age"]);

console.log(props.name); // 張三
console.log(props.age); // 18
</script>

<template>
  <h1>姓名:{{ name }}</h1>
  <h1>年齡:{{ age }}</h1>
</template>
image.png

3.2. props為一個對象

當props為一個對象布近,路由參數(shù)key和value就定死了

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    // about
    {
      path: "/about/:name/:age", // /:name/:age定義傳參屬性name和age
      component: import("../views/about/index.vue"),
      props: {
        name: "王五",
        age: 21,
      },
    },
  ],
});
image.png

3.3. props為一個函數(shù)

函數(shù)的參數(shù)就是當前的route對象,可以根據(jù)這個路由信息按需返回參數(shù)

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    // about
    {
      path: "/about/:name/:age", // 通過/:name定義傳參name /:age定義傳參age
      component: import("../views/about/index.vue"),
      props: (route) => {
        console.log(route); //route 跳轉的路由信息
        return route.params;
      },
    },
  ],
});
<router-link to="/about/張三/18">跳轉about界面</router-link>
<script setup>
import { useRoute } from "vue-router";
const route = useRoute();
const props = defineProps(["name", "age"]);

console.log(props.name); // 張三
console.log(props.age); // 18
</script>

<template>
  <h1>姓名:{{ name }}</h1>
  <h1>年齡:{{ age }}</h1>
</template>

image.png

四丝格、query傳參

4.1. path + query

<router-link
  :to="{
    path: '/about',
    query: {
      name: '張三',
      age: 18,
    },
  }"
  >跳轉about界面</router-link
>
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    // about
    {
      path: "/about",
      component: import("../views/about/index.vue"),
    },
  ],
});
<script setup>
import { useRoute } from "vue-router";
const route = useRoute();
const props = defineProps(["name", "age"]);

console.log(route.query.name); // 張三
console.log(route.query.age); // 18
</script>

<template>
  <h1>姓名:{{ route.query.name }}</h1>
  <h1>年齡:{{ route.query.age }}</h1>
</template>

query傳參的特點參數(shù)會在路由路徑后面?key1=value&key2=value的形式展示

image.png

4.2. name + query

為路由添加name屬性

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    // about
    {
      path: "/about",
      name: "about", //必須
      component: import("../views/about/index.vue"),
    },
  ],
});
<router-link
  :to="{
    name: 'about',
    query: {
      name: '張三',
      age: 18,
    },
  }"
  >跳轉about界面</router-link
>

五撑瞧、params傳參

如果提供了 path,params 會被忽略显蝌,也就是說 path不可以和params共存

錯誤寫法

route對象中queryparams都取不到

<router-link
  :to="{
    path: '/about',
    params: {
      name: '張三',
      age: 18,
    },
  }"
  >跳轉about界面</router-link
>

4.1. 正確寫法:name+params傳參

  • 為路由添加name屬性--name跳轉
  • about路由后面拼接/:name/:age定義傳參屬性nameage(必須)
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    // about
    {
      path: "/about/:name/:age",
      name: "about", // 為路由添加name屬性--name跳轉
      component: import("../views/about/index.vue"),
    },
  ],
});
<router-link
  :to="{
    name: 'about',
    params: {
      name: '張三',
      age: 18,
    },
  }"
  >跳轉about界面</router-link
>
<script setup>
import { useRoute } from "vue-router";
const route = useRoute();
const props = defineProps(["name", "age"]);

console.log(route.params.name); // 張三
console.log(route.params.age); // 18
</script>

<template>
  <h1>姓名:{{ route.params.name }}</h1>
  <h1>年齡:{{ route.params.age }}</h1>
</template>
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末预伺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子曼尊,更是在濱河造成了極大的恐慌酬诀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骆撇,死亡現(xiàn)場離奇詭異瞒御,居然都是意外死亡,警方通過查閱死者的電腦和手機神郊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門肴裙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涌乳,你說我怎么就攤上這事蜻懦。” “怎么了夕晓?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵宛乃,是天一觀的道長。 經(jīng)常有香客問我,道長烤惊,這世上最難降的妖魔是什么乔煞? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮柒室,結果婚禮上渡贾,老公的妹妹穿的比我還像新娘。我一直安慰自己雄右,他們只是感情好空骚,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著擂仍,像睡著了一般囤屹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逢渔,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天肋坚,我揣著相機與錄音,去河邊找鬼肃廓。 笑死智厌,一個胖子當著我的面吹牛,可吹牛的內容都是我干的盲赊。 我是一名探鬼主播铣鹏,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哀蘑!你這毒婦竟也來了诚卸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绘迁,失蹤者是張志新(化名)和其女友劉穎合溺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缀台,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡辫愉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了将硝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡屏镊,死狀恐怖依疼,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情而芥,我是刑警寧澤律罢,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響误辑,放射性物質發(fā)生泄漏沧踏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一巾钉、第九天 我趴在偏房一處隱蔽的房頂上張望翘狱。 院中可真熱鬧,春花似錦砰苍、人聲如沸潦匈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茬缩。三九已至,卻和暖如春吼旧,著一層夾襖步出監(jiān)牢的瞬間凰锡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工圈暗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掂为,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓厂置,卻偏偏與公主長得像菩掏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昵济,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容