vue-router 路由动态传参 query和params的区别

最近空闲一段时间,就没事看了看vue-router的一些知识,想起了之前做项目遇到的一些不解,也就是当初刚入门,文档看的不详细,理解的不全面导致的。现在虽然不怎么会犯这样的错误了,但是还是写下来,记录一下,也方便有需要的朋友查阅,共勉吧。如果能帮到你,那就更好了...

/data/:id这个路由匹配/data/1,/data/2这里的 id 叫 params
/data?id=1 /data?id=2 这里的 id 叫 query

当你使用params方法传参的时候,要在路由后面加参数名,并且传参的时候,参数名要跟路由后面设置的参数名对应。使用query方法,就没有这种限制,直接在跳转里面用就可以。
这句话怎么理解呢?看下边:
如果你要使用params传参,那么你的路由页面index.js必须带上参数,如下

{
   path: '/detail/:id/',
   name: "detail",
   component: detail//这个details是传进来的组件名称
 }

使用: 
方法1:<router-link :to="{ name: 'details', params: { id: 123 }}">点击按钮</router-link>
方法2:this.$router.push({name:'details',params:{id:123}})
页面url显示结果是:http://localhost:8081/#/details/123

如果你要使用query传参,那么你的路由页面index.js必须带上参数,如下

{
   path: '/detail',//这里不需要参入参数,参见上面的params写法
   name: "detail",
   component: detail//这个details是传进来的组件名称
 }

使用: 
方法1:<router-link :to="{ name: 'details', query: { id: 123 }}">点击按钮</router-link>
方法2:this.$router.push({name:'details',query:{id:123}})

方法3:<router-link :to="{ path: 'details', query: { id: 123 }}">点击按钮</router-link>
方法4:this.$router.push({path:'details',query:{id:123}})
页面url显示结果是:http://localhost:8081/#/details?id=123

这里看方法3,4,其实是对应方法1,2的,也就是说使用query方法,可以与path和name共用,2个都可以,但是params只能对应name。

要是想获取参数值:各自的获取方法是:
query和params分别是:this.$route.query.id,this.$route.params.id

顺便说一些参数是多个的情况
params传参,如果路由index.js如下:

{
   path: '/detail/:id/:name',
   name: "detail",
   component: detail//这个details是传进来的组件名称
 }

那么跳转写法:this.$router.push({name:'detail',params:{id:123,name:'lisi'}})
效果:http://localhost:8081/#/details/123/lisi
query的写法参考上面。

query跟params,前者在浏览器地址栏中显示参数,后者则不显示。


转自:https://www.jianshu.com/p/45ee7a6bdc0c

### 实现 Vue-Router 4.5.0 中的路由参数传递 在 Vue-Router 4.5.0 版本中,可以通过多种方式来实现路由之间的参数传递。以下是几种常见的方法及其具体实现。 #### 使用 `params` 参数传递 通过定义动态路径片段并使用 `$route.params` 来获这些参数: ```javascript // 定义带参数的路由规则 const routes = [ { path: '/user/:id', name: 'User', component: UserComponent, }, ]; // 获 params 参数 import { useRoute } from 'vue-router'; export default { setup() { const route = useRoute(); // 打印 id 参数 console.log(route.params.id); } }; ``` 这种方式适用于需要在 URL 地址栏显示参数的情况[^2]。 #### 使用查询字符串 (`query`) 进行传参 当不希望参数出现在 URL 的一部分而是作为附加信息时,可以采用 query 方式: ```javascript // 导航到带有查询参数的目标页面 this.$router.push({ name: 'search', query: { q: 'Vue' } }); // 接收方组件内读查询参数 import { useRoute } from 'vue-router'; setup() { const route = useRoute(); // 访问查询参数中的 q 值 console.log(route.query.q); } ``` 此方法适合用于分页、筛选条件等场景下不需要改变历史记录条目的情况。 #### 利用命名视图与嵌套路由组合传递复杂结构化的数据 对于更复杂的多级或多区域布局需求,则可借助于命名视图以及子路由的方式来进行更为灵活的数据交换: ```javascript { path: '/', components: { default: HomeView, user: UserProfile, }, children:[ { path:'profile', component:ProfileDetail } ] } ``` 上述例子展示了如何在一个父级路由之下设置多个具有不同名称的子视图,并且可以在它们之间共享状态或进一步细化各自的逻辑处理流程[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值