Skip to content

基础中需要注意的点

  1. 如果通过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,刷新后
  1. 嵌套路由中子路由如果使用绝对路径代表路由不嵌套,只嵌套组件。

  2. 新版本vue-router 支持正则表达式的匹配,同时取消了*匹配符,404页面使用正则来匹配

  3. 支持命令路由和命令视图, 大致意思是同一个url,可以渲染多个视图。 ,路由配置中通过components: {default: xxx, slider: xxx} 形式配置

  4. 支持别名,即url显示一个地址,实际界面展示的是另一个路由url配置的组件

js
export default [{
    url: '/',
    component: Home,
    alias: '/home'
}]
// 直接浏览器导航到/home 也会展示/的界面
  1. 支持相对重定向和动态重定向,相对重定向对于当前路由,绝对重定向通过传入一个函数实现

  2. router-link 支持v-slot,将跳转能力自自定义。

  3. 同时router-view 也支持v-slot,能将路由页面进行包裹

生命周期

  1. 组件内beforeRouterLeave
  2. 全局的beforeEach
  3. 路由的beforeEach
  4. 组件内的beforeEnter
  5. 全局的beforeResolve
  6. 全局的afterEach
  7. 新路由的beforeCreated到beforeMounted
  8. 老路由组件的销毁
  9. 新路由mounted

几个关键概念 RouterRecord 和 RouterLocation

RouterRecord 表示路由表,指的是用户在配置路由时的定义,用户配置时RouterRecordRaw,vue-router内部补全成RouterRecordNormalized。理解成路由实例的构造器选项

RouterLocation是实际生效的路由,理解成路由的实例化。其中RouterLocationRaw用于push的参数,相当于根据RouterLocationRaw查找到具体的路由。在to和from以及matched中$route均是这个对象

源码解析

安装插件

  1. 通过mixin添加在beforeCreated中添加绑定_currentRoot._router和_currentRoot._route 属性,在Vue.prototype中将两个$route和$router代理到上面两个属性上.
  2. 注册两个全局组件router-link 和 router-view
  3. 同时还添加了防止重复安装的判断

new VueRouter(Routes)

大致过程就是递归的根据的传入的RouteRecordRaw 生成路由记录表,并生成nameMap和pathMap,同时生成match函数,通过调用match函数获取当前匹配的路由表

router.init()

在安装插件时根据是否是根路由,对不同的路由模式添加监听,监听函数主要对url变化时,调整当前激活的路由写入到全局$route中

router-view

router总是监听当前$route的变化并喧嚷路由对应的界面。通过添加$dataView参数标记自身,查找自身的深度来渲染matched数组的第几项。