Appearance
基础中需要注意的点
- 如果通过path导航,总是回匹配到子路由,如果只想展示父路由,通过name的形式导航
js
export default [{
name: 'parent',
path: '/foo',
component: ParentComponent,
children: [{
name: 'child',
path: '',
component: ChildrenComponent
}]
}]
this.$router.push({path: '/foo'}) // 会渲染parentComponent 和 ChildComponent
this.$router.push({ name: 'parent'}) // 只会渲染parentComponent,刷新后嵌套路由中子路由如果使用绝对路径代表路由不嵌套,只嵌套组件。
新版本vue-router 支持正则表达式的匹配,同时取消了*匹配符,404页面使用正则来匹配
支持命令路由和命令视图, 大致意思是同一个url,可以渲染多个视图。 ,路由配置中通过components: {default: xxx, slider: xxx} 形式配置
支持别名,即url显示一个地址,实际界面展示的是另一个路由url配置的组件
js
export default [{
url: '/',
component: Home,
alias: '/home'
}]
// 直接浏览器导航到/home 也会展示/的界面支持相对重定向和动态重定向,相对重定向对于当前路由,绝对重定向通过传入一个函数实现
router-link 支持v-slot,将跳转能力自自定义。
同时router-view 也支持v-slot,能将路由页面进行包裹
生命周期
- 组件内beforeRouterLeave
- 全局的beforeEach
- 路由的beforeEach
- 组件内的beforeEnter
- 全局的beforeResolve
- 全局的afterEach
- 新路由的beforeCreated到beforeMounted
- 老路由组件的销毁
- 新路由mounted
几个关键概念 RouterRecord 和 RouterLocation
RouterRecord 表示路由表,指的是用户在配置路由时的定义,用户配置时RouterRecordRaw,vue-router内部补全成RouterRecordNormalized。理解成路由实例的构造器选项
RouterLocation是实际生效的路由,理解成路由的实例化。其中RouterLocationRaw用于push的参数,相当于根据RouterLocationRaw查找到具体的路由。在to和from以及matched中$route均是这个对象
源码解析
安装插件
- 通过mixin添加在beforeCreated中添加绑定_currentRoot._router和_currentRoot._route 属性,在Vue.prototype中将两个$route和$router代理到上面两个属性上.
- 注册两个全局组件router-link 和 router-view
- 同时还添加了防止重复安装的判断
new VueRouter(Routes)
大致过程就是递归的根据的传入的RouteRecordRaw 生成路由记录表,并生成nameMap和pathMap,同时生成match函数,通过调用match函数获取当前匹配的路由表
router.init()
在安装插件时根据是否是根路由,对不同的路由模式添加监听,监听函数主要对url变化时,调整当前激活的路由写入到全局$route中
router-view
router总是监听当前$route的变化并喧嚷路由对应的界面。通过添加$dataView参数标记自身,查找自身的深度来渲染matched数组的第几项。
