前言
前面章节我们都是通过router-link进行路由之间的跳转,这种是声明式导航。但日常开发中我们需要从代码层面进行路由跳转,也就是编程式导航,本节我们就来学习一下。
编程式导航
编程式导航在代码层面操作路由,这些操作都是router实例方法,要想使用这些方法就得先访问router实例。vue版本不同访问router实例的方法也不同:
- vue2.x(2.7可以引入组合式API)使用编程式API可以通过this.$router进行访问。
- vue3.x组合式API,在setup中需要使用useRouter函数。 router中有很多实例方法,下面我们了解一下导航相关的。
push方法
router.push方法用于跳转路由,可以导航到任意页面,具体的语法为:
router.push(to)
to参数为具体的路由,ts类型为RouteLocationRaw ,返回一个promise。
RouteLactionRaw是一个联合类型,核心是两种形式:
- RouteQueryAndHash&LocationAsPath&RouteLocationOptions:path(路径)、query(传参)、hash形式组合。
- RouteQueryAndHash & LocationAsRelativeRaw & RouteLocationOptions:name(命令视图)、params(传参)形式组合。
interface RouteQueryAndHash {
query?: LocationQueryRaw;
hash?: string;
}
interface LocationAsPath {
path: string;
}
interface LocationAsRelativeRaw {
name?: RouteRecordName;
params?: RouteParamsRaw;
}
push的参数对象不能混用,比如name与query不能一块使用,这是由具体的ts类型决定的。
router.push({ name: 'home', params: { id: '123' } })
router.push({ path: '/home', query: { id: '123' } })
push的原理就是向history添加新记录,如果我们在A页面用push导航到B页面,点击浏览器退回页面就会回到A页面。虽说原理很简单,但源码还是复杂的,毕竟要考虑各种情况。首先会判断是否有重定向地址,如果有跳转重定向地址。
pushWithRedirect还考虑了replace导航,通过一系列判断最终调用routerHistory的push方法。
routerHistory表示的就是历史路由,继续探索里面的push方法,我们就会发现push的底层API是History:pushState()。
replace方法
router.replace替换当前路由,replace的用法跟push方法基本一样,不过该方法不会往浏览器的历史记录添加记录。
查看push源码时我们就提到replace方法也包含其中,而replace的底层API就是History.replaceState() 。如果我们在用push导航时将replace属性设置为true,结果跟直接调用replace方法一样。
router.push({ name: 'login', replace:true })
router.replace({ path: '/login' })
go方法
router.go(n):将路由前进或后退到第n条记录,n为整数,正数表示前进;负数表示后退。浏览器中前进按钮就相当于router.go(1),后退就相当于router.go(-1)。通过push与replace方法我们可以猜到router.go用到的API就是history.go()。
总结
编程式导航极大地方便了我们的开发,底层方法都是通过window.history方法实现的,利用简单API给导航路由附加各种功能,源码还是值得我们好好学习的。