vue router之params和query使用辨析

声明式 编程式
<router-link :to="..."> router.push(...)

在 Vue 实例中,你可以通过 $router 访问路由实例,因此你可以调用 this.$router.push。属性 to 与 router.push 接受的对象种类相同,两者的规则完全相同

相同点:

  • params和query都能够通过路由访问传递参数

不同点:

  • 传递方式和解析不同:
    1. 通过路径请求:
1
2
3
4
5
6
7
const userId = "123"
const user="lynn"
this.$router.push({ path: `/user/${userId}` }) // -> /user/123 匹配path:"/user/*"地址的路由
//通过this.$router.params.pathMatch获取userId params:{pathMatch:'123'}

this.$router.push({path: `/About/?user=${user}&userId=${userId}`}); // ->/user/?user=lynn&userId=123 
// 通过this.$router.query获取user和usrId  query:{user: "lynn", userId: "11"}
  1. 通过命名和params/query对象传递参数
1
2
3
4
// 路由配置path:"/user"的路由在地址栏不显示参数-> /user
this.$router.push({ name: 'user', params: { userId: '123' }}) 
// 带查询参数,变成 /register?plan=private,注意!!如果用path和params的话params会被忽略
this.$router.push({ path: 'register', query: { plan: 'private' }})
  • 通过路由命名name和params对象传递的参数刷新后会消失,通过query和路径中传递的参数都不会消失
  • 通过配置动态路由可以防止params参数丢失:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
const route = [
{ name: "About", path: "/about/:user/:userId", component: About },
]
// 1.通过地址
this.$router.push({ path: `/user/${user}/${userId}` }) //地址栏中为/about/lynn/11
// this.$router.params为{user:"lynn",userId:"123"}
// 2.通过命名路由和params参数
this.$router.push({
	name: "About",
	params: { user, userId },
}); 
// this.$router.params为{user:"lynn",userId:"123"},地址栏中为/about/lynn/11
  • 通过路由命名name和params对象传参不显示在地址栏,但配合了动态路由的话依然会在地址栏中显示
blablabla
Built with Hugo
主题 StackJimmy 设计