router-link
是创建 a
标签来定义导航链接进行跳转,称为声明式导航,除了声明式导航,还可以借助 router
的实例方法,通过编写代码来实现,这种方式称之为编程式导航,是通过绑定click
事件,调用router.方法
来进行跳转,这两种方式都能实现组件之间的跳转。
语法如下:
router.push(location, onComplete?, onAbort?)
想要导航到不同的 URL,则使用 router.push
方法。这个方法会向 history
栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。
当你点击 router-link
时,这个方法会在内部调用,所以说,点击 <router-link :to="...">
等同于调用 router.push(...)
。
声明式 | 编程式 |
<router-link :to="..."> |
router.push(...) |
该方法的参数可以是一个字符串路径,或者一个描述地址的对象。例如:
// 字符串 router.push('home') // 对象 router.push({ path: 'home' }) // 命名的路由 router.push({ name: 'user', params: { userId: '123' }}) // 带查询参数,变成 /register?plan=private router.push({ path: 'register', query: { plan: 'private' }})
注意:如果提供了 path
,params
会被忽略,上述例子中的 query
并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name
或手写完整的带有参数的 path
:
const userId = '123' router.push({ name: 'user', params: { userId }}) // -> /user/123 router.push({ path: `/user/${userId}` }) // -> /user/123 // 这里的 params 不生效 router.push({ path: '/user', params: { userId }}) // -> /user
同样的规则也适用于 router-link
组件的 to
属性。
注意: 如果目的地和当前路由相同,只有参数发生了改变 (比如从一个用户资料到另一个 /users/1 -> /users/2),你需要使用 beforeRouteUpdate 来响应这个变化 (比如抓取用户信息)。
以下项目代码接之前的项目:Vue系列入门教程(10)——vue-router路由(一)
案例代码1:字符串:
1)在views
目录下新增Login.vue
:
<template> <div> 登录页面 </div> </template> <script> export default { } </script> <style scoped> </style>
2)在Header.vue
的头部菜单,新增登录菜单:
<button @click="login">登录1</button> <!-- 或 .prevent阻止原事件--> <a href="#" @click.prevent="login">登录2</a>
在script
中新增login
方法:
<script> export default { methods:{ login(){ this.$router.push("/login"); } } } </script>
3)在config.js
中新增路由配置:
{ path: '/login', name:'Login', component:()=>import('@/views/Login.vue') }
4)测试:
案例代码2:对象:
1)修改Header.vue
中login
方法如下:
<script> export default { methods:{ login(){ this.$router.push({path:"/login"}); } } } </script>
2)测试效果与案例1一样。
案例代码3:命名的路由:
1)修改Header.vue
中login
方法如下:
<script> export default { methods:{ login(){ this.$router.push( { name:"Login", params:{username:"潘子夜",password:"123456"}, } ); } } } </script>
2)修改Login.vue
的template
如下:
<template> <div> <!-- 获取当前路由params参数 --> 欢迎 {{this.$route.params.username}} 登录,您的密码是:{{this.$route.params.password}} </div> </template>
3)测试:
案例代码4:带查询参数:
1)修改Header.vue
中login
方法如下:
<script> export default { methods:{ login(){ this.$router.push( { // 相当于/login?username=潘子夜&password=123456 path:"/login", query:{username:"潘子夜",password:"123456"} } ); } } } </script>
2)修改Login.vue
的template
如下:
<template> <div> <!-- 获取当前路由query参数 --> 欢迎 {{this.$route.query.username}} 登录,您的密码是:{{this.$route.query.password}} </div> </template>
直接拼接携带参数发送请求在此就不演示了。
2、第二种方式,语法如下:
router.replace(location, onComplete?, onAbort?)
跟 router.push
很像,唯一的不同就是,它不会向 history
添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history
记录。
声明式 | 编程式 |
<router-link :to="..." replace> |
router.replace(...) |
测试方式:
将上面的几个案例中的this.$router.push
替换为this.$router.replace
,然后依次按顺序点击首页、博客、登录1,然后点击浏览器左箭头返回,发现返回的不是博客,而是首页,因为博客地址被登录1的地址替换了。
3、第三种方式,语法如下:
router.go(n)
这个方法的参数是一个整数,意思是在 history
记录中向前或者后退多少步,类似 window.history.go(n)
。
案例代码:
// 在浏览器记录中前进一步,等同于 history.forward() router.go(1) // 后退一步记录,等同于 history.back() router.go(-1) // 前进 3 步记录 router.go(3) // 如果 history 记录不够用,那就默默地失败呗 router.go(-100) router.go(100)
上面的理解了,这就很简单了,这里就不去演示了。