前端开发那些事儿

Vue-Router

2020-12-09  本文已影响0人  _1633_

    我们使用 Vue 开发项目的时候会使用 Vue-Router 这个官方插件来帮助我们处理路由的问题, 它会根据不同的路径映射到不同的视图。我们来看下 Vue-Router 的原理,方便我们再开发中能更得心应手的使用它。


Vue use

    首先我们需要知道 Vue 的其他功能是通过插件方式来解决的,比如 Vue-Router,Vuex;

    Vue 提供了 Vue.use 的全局 API 来注册这些插件;

    Vue.use 接受⼀个 plugin 参数,并且维护了⼀个 _installedPlugins 数组,它存储所有注册过的 plugin ;为了防止重复注册,它也会事先判断下 installedPlugins 是否有这个 plugin;

    接着会判断 plugin 有没有定义 install 方法,如果有的话则调用该方法,并且该方法执行的 第一个参数是 Vue(args.unshift(this)) ;最后把 plugin 存储到 installedPlugins 中

     Vue 提供的插件注册机制很简单,每个插件都需要实现⼀个静态的 install 方法,当我们执⾏ Vue.use 注册插件的时候,就会执行这个 install 方法,并且在这个 install 方法的第⼀个参数我们可以拿到 Vue 对象,这样的好处就是作为插件的编写方不需要再额外去 import Vue了。

vue.use 插件形式 使用

    我们来看看 Vue-Router 的 install 方法

install

    执行 Vue.use(VueRouter) ,就是在执行 install 函数,为了确保 install 逻辑只执行一次,用了 install.installed 变量做已安装的标志位。

    另外用⼀个 全局的 _Vue 来接收参数 Vue ,因为作为 Vue 的插件对 Vue 对象是有依赖的,但又不能去单独去 import Vue ,因为那样会增加包体积,所以就通过这种方式拿到 Vue 对象。

    Vue-Router 安装最重要的一步就是利用 Vue.mixin 去把 beforeCreate 和 destroyed 钩子函数注入到每一个组件中。

mixin

    mixin 就是把要混入的对象通过 mergeOption 合并到 Vue 的 options 中,由于每个组件的构造函数都会在 extend 阶段合并 Vue.options 到自身的 options 中,所以也就相当于 每个组件都定义了 mixin 定义的选项。

    对于 混入的  beforeCreated 钩子函数,对于 根 Vue 实例,执行该钩子函数时定义了 this._routerRoot 表示它自身; this._router 表示 VueRouter 的实例 router ,它是在 new Vue 的时候传入的;另外执行了this._router.init() 方法初始化 router ,然后用 defineReactive 方法把 this._route 变成响应式对象;

 this._router

    对于子组件,由于组件是树状结构,在遍历组件树的过程中,它们在执行该钩子函数的时候 this._routerRoot 始终指向的是 根Vue 实例。

    接着 Vue 原型上定义了 $router 和 $route 2 个属性的 get 方法,这就是为什么我们可以在组件实例上可以访问 this.$router 以及 this.$route ;

    然后通过 Vue.component 方法定义了全局的 两个组件 RouterView 和 RouterLink。


总结

    Vue 编写插件的时候⼀定要提供静态的 install 方法,我们通过 Vue.use(plugin) 时候,就是在执行 install 方法。 

    Vue-Router 的 install 方法会给每⼀个组件注入 beforeCreated 和 destoryed 钩子函数,在beforeCreated 做⼀些私有属性定义和路由初始化工作。

上一篇下一篇

猜你喜欢

热点阅读