VueRouter类图
let _Vue = nullexport default class VueRouter {static install (Vue) {// 1.判断当前插件是否已经被安装if (VueRouter.install.installed) {return}VueRouter.install.installed = true// 2.把vue构造函数记录到全局变量_Vue = Vue// 3.把创建Vue实例时候传入的router对象注入到Vue实例上// 混入_Vue.mixin({beforeCreate () {if (this.$options.router) {_Vue.prototype.$router = this.$options.routerthis.$options.router.init()}}})}constructor (options) {this.options = options// 把options中的route路由规则存储到routeMap中(键值对的形式)this.routeMap = {}// 创建响应式对象,可以直接用在渲染函数或者计算属性中this.data = _Vue.observable({// 存储当前的路由地址,默认模式下时/current: '/'})}init () {this.createRouteMap()this.initComponent(_Vue)this.initEvent()}createRouteMap () {// 遍历所有的路由规则,把路由规则解析成键值对的形式,存储到routeMap中this.options.routes.forEach((route) => {this.routeMap[route.path] = route.component})}initComponent (Vue) {// 注册组件router-linkVue.component('router-link', {props: {to: String},// template: '<a :href="to"><slot></slot></a>'// h函数帮助我们创建虚拟domrender (h) {return h('a', {// dom对象attrs: {href: this.to},on: {click: this.clickHandler}}, [this.$slots.default])},methods: {clickHandler (e) {history.pushState({}, '', this.to)this.$router.data.current = this.toe.preventDefault()}}})// 注册组件router-viewconst self = thisVue.component('router-view', {render (h) {const component = self.routeMap[self.data.current]return h(component)}})}initEvent () {window.addEventListener('popstate', () => {this.data.current = window.location.pathname})}}
