【Vue3】路由传参的几种方式

本文详细介绍了Vue路由中的声明式和编程式导航,比较了query和params参数的不同用法,推荐了对象写法,并讨论了如何简化参数使用,如解构配合toRefs和props配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

路由导航有两种方式,分别是:声明式导航 和 编程式导航
参数分为query参数和params参数两种

声明式导航

query参数

一、路径字符串拼接(不推荐)

1.传参

在路由路径后直接拼接?参数名:参数值 ,多组参数间使用&分隔。

<RouterLink to="/path/path1?name=田本初&age=23"></RouterLink>

如果参数值为变量,需要使用模版字符串。

let str = "田本初"
<RouterLink :to=`"/path/path1?name=${str}&age=23"`></RouterLink>

2.接收与使用

// 接收
import { useRoute } from "vue-router"
const route = useRoute()

// 使用
<div>{{ route.query.name }}</div>
<div>{{ route.query.age }}</div>

二、to传对象写法(推荐)

1.传参

to不再传递字符,而是传一个对象,由于参数为对象,所以to前需要加上:

<RouterLink :to="{ 
	path: "/path/path1",
	query: {
		name: "田本初",
		age: 23
	}
}"/>

2.接收与使用

// 接收
import { useRoute } from "vue-router"
const route = useRoute()

// 使用
<div>{{ route.query.name }}</div>
<div>{{ route.query.age }}</div>

同拼接字符串的使用方式

params参数

params参数,需要在路由规则中提前声明参数名,参数名前不要丢失冒号 。

这里给 路由/path/path1 添加了name和age参数,由于age后添加了问号,所以age为可传参数,否则未传age会报错。

{
	path:"/path",
	component: Comp1
	children:[
		{ path:'path1/:name/:age?',component: Comp2 }
	]
}

一、路径字符串拼接(不推荐)

1.传参

在路由路径后直接拼接/参数值

<RouterLink to="/path/path1/田本初/23"></RouterLink>

参数值如果是变量,使用模版字符串

let str = "田本初"
<RouterLink :to=`"/path/path1/${str}/23"`></RouterLink>

2.接收与使用

// 接收
import { useRoute } from "vue-router"
const route = useRoute()

// 使用
<div>{{ route.params.name }}</div>
<div>{{ route.params.age }}</div>

二、to传对象写法(推荐)

1.传参

to不再传递字符,而是传一个对象,由于参数为对象,所以to前需要加上冒号

如果使用path,会报警告 ,译为如果写path会被忽略,请使用name。

<RouterLink :to="{ 
	path: "/path/path1",
	params: {
		name: "田本初",
		age: 23
	}
}"/>

在这里插入图片描述

正确写法:路径使用name,注意name需保持与路由规则中的一致。

// 路由规则配置
{
	path:"/path",
	component: Comp1
	children:[
		{ name:'path1Name',path:'path1/:name/:age',component: Comp2 }
	]
}

// 传参
<RouterLink :to="{ 
	name: "path1Name",
	params: {
		name: "田本初",
		age: 23
	}
}"/>

注意:params参数不能传数组或对象,否则会报警告。

2.接收与使用

// 接收
import { useRoute } from "vue-router"
const route = useRoute()

// 使用
<div>{{ route.params.name }}</div>
<div>{{ route.params.age }}</div>

如果想通过 解构 简化代码,则需要配合 toRefs

// 接收
import { useRoute } from "vue-router"
import { toRefs } from "vue"
const route = useRoute()
let { params } = useRoute()

// 使用
<div>{{ params.name }}</div>
<div>{{ params.age }}</div>

路由的 props 配置

1. props: true

上述 params 参数配合解构的写法太过繁琐,可以直接通过路由的props配置,达到简化代码的效果。

路由配置中添加 props: true,可以理解为<Comp2 name="" age=""></Comp2>,然后子组件中就可以使用 defineProps 直接使用。

// 路由规则配置
{
	path:"/path",
	component: Comp1
	children:[
		{ name:'path1Name',path:'path1/:name/:age',component: Comp2,props: true }
	]
}

// 组件接收props
defineProps(["name", "age"])

// 使用
<div>{{ name }}</div>
<div>{{ age }}</div>

需要注意:props字段默认只支持 params 参数。

如果想接收 query参数,需要采用 props的函数式 写法,参数为 route,手动返回 route.query 即可。

// 路由规则配置
{
	path:"/path",
	component: Comp1
	children:[
		{ name:'path1Name',path:'path1',component: Comp2,props(route){return route.query} }
	]
}

2. props 的函数式写法

编程式导航(推荐使用)

以上 <RouterLink> 标签的写法是声明式导航,但是开发中编程式导航更常用

不同于声明式导航,编程式导航是函数形式,相比于声明式导航的标签,更加灵活。

语法:
引入useRouter,router有两种方式,分别为push和replace,push会保留历史记录,replace不会保留历史记录,参数对象与声明式导航的对象写法一致。

import { useRouter } from "vue-router"
const router = useRouter()

function hanlder() {
	router.push({
		name:'xxx',
		query:{ name:'田本初', age:23}
	})
}

如何简化参数使用

方法一: 解构 配合 toRefs

如果解构使用query/params对象,由于是直接从响应式数据中解构,变量会丢失响应式,需要使用toRefs。

// 接收
import { useRoute } from "vue-router"
import { toRefs } from "vue"
const route = useRoute()
const { query } = toRefs(route)

// 使用
<div>{{ query.name }}</div>

方法二:路由的props配置

方式一:将路由收到的所有params参数作为props传给路由组件

路由规则中添加 props:true

// 路由规则配置
{ path:'/path/path1/:name/:age', component: Comp2, props: true }

使用参数时,defineProps([‘name’,‘age’])

defineProps(['name','age'])

<div>{{ name }}</div>
<div>{{ age }}</div>

方式二:方式一只能处理params参数,如果想处理query参数,需要写成函数形式

路由规则中添加props函数

// 路由规则配置
{ 
	path:'/path/path1/:name/:age', 
	component: Comp2, 
	props(route){
		return route.query
	} 
}

使用参数时,defineProps([‘name’,‘age’])

defineProps(['name','age'])

<div>{{ name }}</div>
<div>{{ age }}</div>

总结

  • 路由导航分为声明式导航和编程式导航,声明式导航就是<RouterLink>标签,编程式导航就是函数形式。
  • 编程式导航有两种方式,push和replace,其中push会保留历史记录(浏览器可回退),replace不会保留历史记录。
  • query参数和params参数均有「拼接字符串写法」和「对象写法」,但更推荐使用to传对象的方式。
  • query拼接字符串在路径后添加 ?参数名=参数值,多组参数间以&分隔。
  • params拼接字符串在路径后直接 /参数值即可,但需要在路由规则中提前声明参数名,格式为path/:参数名,如果为可选参数,在参数名后添加问号
  • 对象写法中,query参数既可以使用path又可以使用name,但是params参数只能使用name
### Vue 3 路由传参的方法 在 Vue 3 中,路由传参是一个常见的需求,可以通过多种方式进行实现。以下是几种常用的方式及其具体示例: #### 1. 使用 `params` 参数 通过路径中的占位符传递参数,这种方式适用于需要将参数嵌入到 URL 的场景。 ##### 定义路由规则 ```javascript const routes = [ { path: &#39;/user/:id&#39;, name: &#39;UserDetail&#39;, component: () => import(&#39;@/views/UserDetail.vue&#39;) } ]; ``` ##### 导航至目标路由并传递参数 ```javascript this.$router.push({ name: &#39;UserDetail&#39;, params: { id: 123 } }); // 结果URL: /user/123 ``` 需要注意的是,在使用 `params` 方式时,如果直接指定字符串形式的路径,则无法携带参数[^1]。 --- #### 2. 使用 `query` 参数 通过查询字符串的形式附加参数,适合不需要暴露给用户的临时性数据。 ##### 导航至目标路由并传递参数 ```javascript this.$router.push({ path: &#39;/search&#39;, query: { keyword: &#39;Vue.js&#39; } }); // 结果URL: /search?keyword=Vue.js ``` 在目标组件中读取 `query` 参数: ```javascript export default { mounted() { const keyword = this.$route.query.keyword; console.log(keyword); // 输出: Vue.js } }; ``` 此方法的优点在于不会改变路由结构,同时便于调试和分享链接[^2]。 --- #### 3. 使用导航守卫与状态管理结合 对于更复杂的数据交互需求,可以借助 Vuex 或 Pinia 进行全局状态管理,并配合导航守卫完成逻辑处理。 ##### 示例代码 设置导航前的操作: ```javascript router.beforeEach((to, from, next) => { if (to.name === &#39;OrderDetails&#39;) { store.dispatch(&#39;fetchOrderData&#39;, to.params.orderId); } next(); }); ``` 这样可以在进入特定页面之前提前加载所需数据[^4]。 --- #### 动态路由匹配 当存在多个相似功能模块时,可利用动态路由简化配置过程。 ##### 配置动态子路由 ```javascript { path: &#39;/category/:type&#39;, component: CategoryView, children: [ { path: &#39;:itemId&#39;, component: ItemDetailView }, ] } ``` 访问 `/category/books/978` 将会触发父级组件渲染以及对应的子组件实例化操作[^3]。 --- ### 总结 以上介绍了基于 Vue Router 实现的不同类型的路由传参方案,开发者应根据实际业务需求灵活选用合适的技术手段。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

田本初

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

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

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

打赏作者

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

抵扣说明:

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

余额充值