Vue3快速上手(十六)Vue3路由传参大全

在这里插入图片描述
Vue3路由传参

一、传参的多种方式

1.1 拼接方式

这种方式适合传递单个参数的情况,比如点击查看详情,传个id这样的场景

传参:

<RouterLink to="/person?id=1" active-class="active">person</RouterLink>
<!-- 一般是这样写,动态传参 -->
<RouterLink :to="`/person?id=${obj.id}`" active-class="active">person</RouterLink>

接参:

import { useRoute } from 'vue-router';

// 接收路由传参
let route = useRoute()
console.log('useRoute()-->', route);
console.log('接参:id = ', route.query.id);

在这里插入图片描述

1.2 对象方式

对象方式,适合一起传递多个参数,比较清晰明了,使用拼接方式虽然也能实现,但杂乱无章,不易维护,且容易出错。
传参:

<RouterLink :to="{
  path: '/person',
   query: {
     id: 1,
     name: '王大拿',
     age: 56
   }
 }" active-class="active">
   person
</RouterLink>

接参:

import { toRefs } from 'vue'
import { useRoute } from 'vue-router';

// 接收路由传参
let route = useRoute()
let {query} = toRefs(route)
console.log('接参:id = ', query.value.id);
console.log('接参:name = ', query.value.name);
console.log('接参:age = ', query.value.age);

在这里插入图片描述

1.3 params参数方式

params方式,需要在路由上设置需要传递参数的占位,如下:我在person后占位3个参数,且age为不必填项。id和name为必填项

// 创建1个路由器
const router = createRouter({
    // 路由器的工作模式
    history: createWebHistory(),
    /* 多个路由配置 */
    routes: [
        {
            name: 'ren',
            path: '/person/:id/:name/:age?',
            component: PersonVue
        }
    ]
});

也有2种方式,拼接路径方式、传递对象方式:

1.3.1 params拼接路径方式

传参:这里不传递age,因为上面设置age不是必传项

<RouterLink to="/person/1/王小拿" active-class="active">person</RouterLink>

接参:这里接params参数

import { toRefs } from 'vue'
import { useRoute } from 'vue-router';

// 接收路由传参
let route = useRoute()
console.log('route->', route);

let {params} = toRefs(route)
console.log('接参:id = ', params.value.id);
console.log('接参:name = ', params.value.name);
console.log('接参:age = ', params.value.age);

在这里插入图片描述

1.3.2 params传递对象方式

** ☆这里和1.2里不一致的是**:用的是name和params传递。1.2里用个是:path和query传递。
传参:

<RouterLink :to="{
      name: 'ren',
      params: {
        id: 1,
        name: '王大拿',
        age: 56
      }
}" active-class="active">
	person
</RouterLink>

接参:这里接params参数

import { toRefs } from 'vue'
import { useRoute } from 'vue-router';

// 接收路由传参
let route = useRoute()
console.log('route->', route);

let {params} = toRefs(route)
console.log('接参:id = ', params.value.id);
console.log('接参:name = ', params.value.name);
console.log('接参:age = ', params.value.age);

在这里插入图片描述

1.4 props方式

1.4.1 props方式1

基于1.3params方式传递参数,开启props为true。那么就可以通过defineProps(['id', 'name', 'age'])直接接收参数,并在页面上展示。

// 创建1个路由器
const router = createRouter({
    // 路由器的工作模式
    history: createWebHistory(),
    /* 多个路由配置 */
    routes: [
        {
            name: 'ren',
            path: '/person/:id/:name/:age?',
            component: PersonVue,
            props: true
        }
    ]
});

传参:

<RouterLink to="/person/1/王小拿" active-class="active">person</RouterLink>

接参:这里通过defineProps()接参数

<template>
    <div class="person">
        <h3>ID{{ id }}</h3>
        <h3>姓名:{{ name }}</h3>
        <h3>年龄:{{ age }}</h3>
    </div>
</template>

<script lang='ts' setup name="PersonCom">
defineProps(['id', 'name', 'age'])
</script>

在这里插入图片描述

1.4.2 props方式2

通过props(route){}函数的方式,传递参数。这种方式既支持params对象方式,也支持query对象的方式。

(一)params对象方式:
需要占位,返回route.params

// 创建1个路由器
const router = createRouter({
    // 路由器的工作模式
    history: createWebHistory(),
    /* 多个路由配置 */
    routes: [
        {
            name: 'ren',
            path: '/person/:id/:name/:age?',
            component: PersonVue,
            props(route){
                return route.params
            }
        }
    ]
});

传参:

<RouterLink :to="{
  name: 'ren',
  params: {
    id: 1,
    name: '王大拿',
    age: 56
  }
}" active-class="active">
  person
</RouterLink>

接参:这里通过defineProps()接参数

<template>
    <div class="person">
        <h3>ID{{ id }}</h3>
        <h3>姓名:{{ name }}</h3>
        <h3>年龄:{{ age }}</h3>
    </div>
</template>

<script lang='ts' setup name="PersonCom">
defineProps(['id', 'name', 'age'])
</script>

(二)query对象方式:
去掉占位,返回route.query

// 创建1个路由器
const router = createRouter({
    // 路由器的工作模式
    history: createWebHistory(),
    /* 多个路由配置 */
    routes: [
        {
            name: 'ren',
            path: '/person',
            component: PersonVue,
            props(route){
                return route.query
            }
        }
    ]
});

传参:

<RouterLink :to="{
    path: '/person',
    query: {
      id: 1,
      name: '王大拿',
      age: 56
    }
}" active-class="active">
  person
</RouterLink>

接参:这里通过defineProps()接参数

<template>
    <div class="person">
        <h3>ID{{ id }}</h3>
        <h3>姓名:{{ name }}</h3>
        <h3>年龄:{{ age }}</h3>
    </div>
</template>

<script lang='ts' setup name="PersonCom">
defineProps(['id', 'name', 'age'])
</script>

效果都是一样的,浏览器地址不同:params是路径方式;query是参数拼接方式。
在这里插入图片描述

END

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一掬净土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值