@query传参_Vuerouter路由跳转的两种方式与路由传参的方法

路由的两种跳转方式

路由跳转有两种方式:声明式和编程式。

我们之前用的创建 a 标签来定义导航链接属于声明式。我们还可以借助 router 的如下这些实例方法创建编程式导航:

router.push

router.push(...)它就等同于

router.push(...)这个方法会向 history 栈添加一个新的记录,当用户点击浏览器后退按钮时,则回到之前的 URL。该方法的参数可以是一个字符串路径,或者一个描述地址的对象。例如:

//字符串

router.push('home')

//对象

router.push({path:'home'})

//命名的路由

router.push({ name: 'user', params: { userId: '123' }})

// 带查询参数,变成 /register?plan=private

router.push({ path: 'register', query: { plan: 'private' }})

const userId = '123';

router.push({ name: 'user', params: { userId }})

// ->    /user/123

router.push({ path: `/user/${userId}` })

// ->    /user/123

router.replace(location)

跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 一一 替换掉当前的 history 记录。

044b1c0767168e42fe6baad67acd3c6b.png

设置 replace 属性(默认值: false)的话,当点击时,会调用 router.replace() 而不是 router.push(),于是导航后不会留下 history 记录。即使点击返回按钮也不会回到这个页面。加上replace: true后,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。 d1a39a8af85e6dc1d398ee60bd5aff4b.png

router.go(n)

这个方法的参数n是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)。

2f3acd4e65d12c50827feba502317878.png

router、routes、route的区别

1. router:指的是路由实例。如:路由编程式导航的this.$router.push( )也能进行跳转,这个方法则会向history里面添加一条记录,当点击浏览器回退按钮或者this.$router.back()就会回退之前的url。而this.$router.back(-1)就是返回上一个路由。

2.routes:指创建路由实例的配置项。用来配置多个route路由对象。routes出现在router文件夹下的index.js文件里,如下图:

fc9eaf744d9980b5f28696deaa94fee3.png

就是我们在routes里进行路由配置,我们发现routes里对象里的component属性值既可以写成组件名,也可以直接( )=>import路径写入,这两种写法都是可以的,只不过后一种方法就不用再在上面单独import...from...引入了。

3.route:路由对象。如:this.$route指的就是当前路由对象,可以从对象里面获取name,path,params,query,hash等。

动态路由(路由传参)

动态路径参数,使用冒号 : 标记。当匹配到一个路由时,参数值会被设置到this.$route.params,可以在每个组件内使用。

你可以在一个路由中设置多段“路径参数”,对应的值都会设置到$route.params中。例如:

57b4c8406588cc7854803bfdc7c440b4.png

动态路由很适合用于类似商品详情页的需求,商品详情页的页面结构都一样,只是商品id的不同,然后id不同,详情页渲染出的结果不一样,所以这个时候就可以用动态路由。

router文件夹下的index.js里配置动态路由

d40baca715470a47f0e4ed264c48d1fd.png

goods组件里

766395ce412e52ef3280115bdaca9eac.png

在浏览器地址栏中输入/goods/123

7a5cd9160c2a4f897eeb3b0f65e09b02.png

深入了解路由传参方法

现有如下场景 点击当前页的某个按钮跳转到另外一个页面里面去,并将某个值带过去。

69e58c0fa76e36abe51c9ab2f1c753e4.png

第一种方法:params传参,url中会显示参数, 页面刷新数据不会丢失。

481cf58f3a60f9db92cec4c2fd3bf06e.png

需要在routes里对应路由配置如下:

e673b7fbbe5cf1c86f9622666af53e77.png

可以看出需要在path中添加/:id来对应 $router.push 中path携带的参数。在子组件中可以使用this.$route.params.id来获取传递的参数值

第二种方法:params传参,url中不会显示参数, 页面刷新数据会丢失。

定义路由时添加name属性给映射的路径取一个别名,在router文件夹的index.js文件修改router如下:

c82ccc0da9f3296146655e7245163a33.png

在父路由组件上使用router-link进行路由导航,使用   

子路由组件页面获取父路由传参方式不变,reg.vue 文件如下:

0df4e3cb39d30422f02d41082fe32ea6.png

上述这种利用params不显示url传参的方式会导致在刷新页面的时候,传递的值会丢失。

第三种方法:query传参,url中会显示参数
使用path来匹配路由,然后通过query来传递参数,这种情况下query传递的参数会显示在url后面?id=?

8e603ddc8c6ee770f2c633c1255d5b42.png

对应路由配置如下:

574400bcc3009371ed34b1e6fdd185c0.png

对应子组件里用this.$route.query.id来获取参数值。

再来看个用query传参的例子:

定义路由 router>index.js文件如下:

c95a58dd9f07eb1fba7a45e6a31ac662.png

修改路由导航  ,childOne.vue 文件修改如下:

45e65197ba774a21e5a4f4a018a85f88.png

子路由组件通过 this.$route.query.num 来显示传递过来的参数,reg.vue 文件如下:

7840d4f65ebb2f5b13bc13d71fdf6445.png

7cb59d1e87dfe19b6a90b9027f517e33.png

默认为hash模式,最明显的标志是,URL上有#号localhost:8080/#/,路由会监听#后面的信息变化进行路由匹配另一种为history模式,不会有#出现,很大程度上对URL进行了美化。需要注意的是history模式在打包后的路由跳转需要服务器配合

params与query传参有何区别?

query 传参配置的是path,而params传参配置的是name,在params中配置path无效。query在路由配置不需要设置参数,而params必须设置。query传递的参数会显示在地址栏中,params传参刷新会无效,但是query会保存传递过来的值,刷新不变 。

一般来说,我们项目开发中就用第一种方法或第三种方法来传递参数。

一起来学习 99b22421e3861c67a3e6c69a6dcb105a.png长按或扫码关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值