百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Vue Router 4 路由操作 - 路由的参数传递与接收

toqiye 2024-10-01 22:59 1 浏览 0 评论

什么是路由参数?

Vue Router提供了两种参数传递的模式,params模式 query模式

params模式

路径参数用 冒号: 表示,当一个路由被匹配成功,它的params值将被保存到路由地址的params属性中,在接收的时候,通过 router.params 就可以拿到传递的参数。

// 定义如下两个路由Test和Test1,并给Test路由配置参数
// router/index.js
const routes = [{
	path: '/test/:id,
  name: 'Test',
  component: () => import('@/views/test/Test.vue')
}, {
	path: '/test1,
  name: 'Test1',
  component: () => import('@/views/test/Test1.vue')
}]

// 如果Test1路由,想要跳转到Test路由,并且传递参数,如下操作
// views/test/Test1.vue
router.push({
	name: 'Test',
  params: {
  	id: 1
  }
})

// 在Test路由对应的Test组件中,使用如下方式获取到传递的参数
// views/test/Test.vue
const id = router.params.id // 1

query模式

路径参数是以 问号?开头,以 &符号 分割的 序列化字符串,例如:/test2?name=12&id=3

当对应的路由被匹配,它的query值将被保存到对应路由地址的query属性中,通过 router.query 即可拿到对应的参数。

// 定义如下两个路由Test2和Test3
// router/index.js
const routes = [{
	path: '/test2',
  name: 'Test2',
  component: () => import('@/views/test/Tes2.vue')
}, {
	path: '/test3,
  name: 'Test3',
  component: () => import('@/views/test/Test3.vue')
}]

// 如果Test3路由,想要跳转到Test2路由,并且传递参数,如下操作
// views/test/Test3.vue
router.push({
	name: 'Test2',
  query: {
  	name: 12,
    id: 3
  }
})

// 在Test2路由对应的Test2组件中,使用如下方式获取到传递的参数
// views/test/Test2.vue
const id = router.query.id // 3
const name = router.query.name //12

路由之间的参数传递与接收

在路由导航的时候,我们只能通过 router.push 传递参数,其他的方式均无法传递参数。

router.push 的参数可以有 四种形式,并且前三种形式是等价的。

// 1.路径字符串形式的路由地址
router.push('/test2?name=12&id=3')

// 2. path + query 方式的路由地址,
// 注意,此方式下,path不能传递params模式的参数
router.push({
	path: '/test2',
  query: {
  	name: 12,
    id: 3
  }
})

// 3. name + query 方式的路由地址
router.push({
	name: 'Test2',
  query: {
  	name: 12,
    id: 3
  }
})

// 4. name + params 方式的路由地址
// 注意,此方式下,需要在路由记录中配置动态参数占位符,例如:path: '/test2/:name/:id'
router.push({
	name: 'Test2',
  params: {
  	name: 12,
    id: 3
  }
})

路由向组件的参数传递与接收

路由向组件传递参数的方式和路由之间的传递参数方式是一致的,只是在接收参数的时候有所区别。

组件对外暴露属性的方式是通过props方式进行的,所以,路由向组件传参,即是路由向props传递参数。

我们只需要在routes中配置props相关参数即可实现路由向组件传参,官方文档提供了如下四种配置方式。

布尔模式

当路由记录的props属性被设置为true时,路由地址中的router.params将被转为组件的props中的属性。

// router/index.js
// 当props被设置为true时,router.params将被转为组件的props中的属性
const routes = [{
	path: '/test2/:name/:id',
  name: 'Test2',
  component: () => import('@/views/test/Tes2.vue'),
  props: true
}]

// 在Test2.vue中的props可定义如下
// views/test/Test2.vue
const props = defineProps({
	name: [String, Number],
  id: Nuber
})

命名视图

对于有命名视图的路由,必须给每一个命名视图路由定义props配置。

// router/index.js
// 需要注意的是,在多个命名视图中,
// 我们必须将命名视图对应的参数一一定义在路由对应的path中
// 例如 /test2/:name/:id/:title
const routes = [{
	path: '/test2/:name/:id/:title',
  name: 'Test2',
  components: {
    default: () => import('@/views/test/Tes2.vue'),
    SideBar: () => import('@/views/test/SideBar.vue')
  },
  props: {
    default: true,
    SideBar: true
  }
}]

// 在Test2.vue中的props可定义如下
// views/test/Test2.vue
const props = defineProps({
	name: [String, Number],
  id: Nuber
})

// 在SideBar.vue中的props可定义如下
// views/test/SideBar.vue
const props = defineProps({
	title: String
})

对象模式

如果路由记录中的props是一个对象,会直接将该对象设置为组件的props。

// router/index.js
// 注意,此模式下,不需要用过router.push传参
const routes = [{
	path: '/test2',
  name: 'Test2',
  component: () => import('@/views/test/Tes2.vue'),
  props: {name: 12, id: 3}
}]

// 在Test2.vue中的props可定义如下
// views/test/Test2.vue
const props = defineProps({
	name: [String, Number],
  id: Nuber
})

函数模式

路由记录中的props的值也可以是一个函数,它将返回一个props跟组件的props对应,可以看做是对象模式的进阶版。

// router/index.js
// 注意,此模式下,即可以处理router.push传递的参数,也可以不传值,使用静态数据
const routes = [{
	path: '/test2/:name/:id',
  name: 'Test2',
  component: () => import('@/views/test/Tes2.vue'),
  props: route => ({...route.params, title: 'this is title'})
}]

// 在Test2.vue中的props可定义如下
// views/test/Test2.vue
const props = defineProps({
	name: [String, Number],
  id: Nuber,
  title: String
})

总结

在使用router.push导航时,建议使用name + query 或者 name + params的方式传递参数,增加项目的可维护性。

相关推荐

完美解决MAC电脑空间不足问题(完美解决mac电脑空间不足问题的办法)

很多用MAC(苹果笔记本)电脑的人,特别是做iOS开发的,都会遇到一个头疼的问题,那就是电脑磁盘空间不足的问题。这个问题也困扰了我好久,我的开发机是256G的SSD(固态硬盘),但是用着用着就会空间不...

系统清理软件Omni Remover for Mac版

内容介绍你是否需要一款可以帮你清理Mac系统顽固垃圾的工具呢?试试OmniRemoverforMac吧!OmniRemoverMac版是一款运行在Mac平台上的系统清理软件。OmniRem...

mac上一款好用的多功能系统清理软件Omni Remover for Mac

mac上一款好用的多功能系统清理软件——OmniRemoverforMac。OmniRemovermac破解版是Mac平台上的一款软件清理工具。OmniRemoverMac版专为优化内存...

清理重建mac OS图标缓存(mac系统清空)

关于macos缓存问题你了解多少?今天macdown小编带大家了解下有关Mac清除图标缓存的相关知识!你知道吗?为了提升图形界面加载速度,默认情况下macOS针对Finder和Dock中的...

iOS 9 人机界面指南(五):图标与图形设计

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。文章索引5.1图标与图像尺寸(IconandImageSizes)5.2应用图标(AppIcon)5.2....

你中招了吗?盘古团队发布XcodeGhost病毒检测应用

最近大批知名iOS应用被感染XcodeGhost病毒事件闹得沸沸扬扬,虽然该病毒作者发表声明称,XcodeGhost源于自己的实验,没有任何威胁性行为,同时公开了源代码。但依然无法消除众多用户的担忧,...

iOS应用感染Xcode真是无恶意实验?感染APP最新名单及版本号

前瞻科技快讯9月19日消息,一向号称是最安全的iOS真的不安全了?对于这两天闹得沸沸扬扬的多款iOS应用感染XcodeGhost病毒事件,今日凌晨4点左右,网友@XcodeGhost-Author在微...

苹果应用签名失败怎么处理(ios应用签名什么意思)

在移动应用开发过程中,苹果应用签名失败是一种常见的问题,它可能由多种原因引起。本文将介绍一些处理苹果应用签名失败的方法,帮助开发者解决这个问题。检查证书和描述文件:首先,开发者应该检查使用的证书和描述...

好用的系统扫描和清理工具推荐:OS Cleaner Pro for Mac

为大家推荐一款全面的系统扫描和清理工具,OSCleanerProforMac...

系统清理软件 Omni Remover for Mac

你是否需要一款可以帮你清理Mac系统顽固垃圾的工具呢?试试OmniRemoverforMac吧!OmniRemoverMac版是一款运行在Mac平台上的系统清理软件。OmniRemover...

优秀的Mac系统清理软件(mac清理系统占用空间)

OmniRemoverforMac是一款优秀的系统清理软件,功能有清洁卸载膨胀且顽固的应用程序,在macOSCatalina上清除32位不兼容的应用程序,iTunes,Xcode和Sketc...

苹果app安卓apk应用内用微信登录游戏时会显示登录失败怎么解决?

解决苹果iOS应用和安卓APK应用在使用微信授权登录时出现“登录失败,签名不一致”的问题,可以按照以下步骤进行排查和解决:1.核实AppID和AppSecret:确保iOS和安卓项目中使用的微信开放...

Cleaner for Xcode(遗留废弃文件清理工具)

Mac上的Xcode总是占用很大空间,并且用的时间越久越大!可通过删除不需要的和不建议使用的文件来帮助您加快Xcode的运行速度,你可以每月或者每周运行一次进行清理。有需要的朋友,赶快来下载吧~Cle...

Cleaner for Xcode mac(xcode清理工具)

Xcode文件太多,如何检测清理?试试CleanerforⅩcode吧!CleanerforXcodeforMac可以检测您的Xcode占用磁盘的情况,统计各个部件所占用的空间。并帮助您...

柠檬清理一款Mac设备必备的实用工具

简介柠檬清理是针对macOS系统专属制定的清理工具。主要功能包括重复文件和相似照片的识别、软件的定制化垃圾扫描、可视化的全盘空间分析、内存释放、浏览器隐私清理以及设备实时状态的监控等。重点聚焦清理功能...

取消回复欢迎 发表评论: