路由导航分为 声明式导航 和 编程式导航。
通过 <router-link to="..."> 标签跳转的方式为声明式导航。
通过 路由实例对象(router.push(...))跳转的为编程式导航。
导航到不同的位置
想要导航到不同的URL,使用 router.push 方法。该方法会向 浏览器的历史记录栈 新增一条记录。当点击浏览器的回退按钮时,会退回到之前的URL。
在声明式导航中,我们使用<router-link>标签进项跳转,类似于HTML中的a标签。需要注意的是,当点击<router-link>标签时,内部调用的依然是router.push方法进行跳转。
不管是<router-link>标签的 to 属性,还是router实例对象的 push 方法,都有相同的以下三种类型的值:
path路由地址字符串
// 声明式
<router-link to="/home"></router-link>
// 编程式
router.push('/home')
包含path的路由地址对象
// 声明式
<router-link :to="{ path: '/home' }"></router-link>
// 编程式
router.push({ path: '/home' })
包含name的路由地址对象
// 声明式
<router-link :to="{ name: 'Home' }"></router-link>
// 编程式
router.push({ name: 'Home' })
替换当前位置
跟 router.push 有所不同的是,虽然都是导航到浏览器的某个历史记录,但 router.replace 会替换当前浏览器历史记录栈中的对应的记录,而 router.push 是新增。
// router.replace与router.push使用方式类似
// 声明式
<router-link :to="{ name: 'Home' }" replace></router-link>
// 编程式
router.replace({ name: 'Home' })
在历史记录中随意跳转
使用router.go可以在浏览器的历史记录栈中随意切换,不会新增历史记录,也不会替换当前历史记录。
// 此方式只适用于编程式导航
// n 为浏览器历史记录栈长度范围内的数字
router.go(n)
router.go(1) // 前进
router.go(-1) // 后退
router.go(2) // 前进两条记录
router.go(100) // 如果历史记录没有那么多条数,则静默失败
返回之前的历史记录
使用router.back返回跳转之前的历史记录,相当于 router.go(-1),需要注意的是,在使用 router.replace 跳转方式时,router.back 不能返回到之前的历史记录,因为已经被替换掉了。
// 此方式只适用于编程式导航
router.back()
在历史记录中前进
使用 router.forward 在历史记录中前进,相当于 router.go(1)
// 此方式只适用于编程式导航
router.forward()
一些额外的扩展知识
Vue Router模仿了 Browser History APIs,如果有这方面的使用经验,则使用Vue Router会非常熟悉,如果有条件的可以去自己学习一下。