最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 深入理解Vue的插件机制与install

    正文概述 掘金(根小乐)   2020-11-24   574

    前言

    我们在使用Vue的时候,经常会使用并写一些自定义的插件,然后利用Vue.use引入。所以提到写插件,install这个方法是必不可少的。Vue.js 的插件应该暴露一个 `install` 方法。这个方法的第一个参数是 `Vue` 构造器,第二个参数是一个可选的选项对象。这是Vue官方对Vue插件的规范。那这install函数到底是什么东东呢,Vue内部到底用它做了什么处理,怎么调用的,今天我就给大家伙从源码层面把他整的明明白白。 看完这篇文章,你将学到:

    • install函数可以做些什么;
    • install内部是怎么实现的;
    • Vuex,Vue-Router插件在install期间到底干了什么;

    好啦,闲话不多说,咱们直接开始!!! 深入理解Vue的插件机制与install

    install在Vuex&Vue-Router中的处理

    这里先抛出两个问题,大家可以思考下,算是挖坑,下面再逐一解答:

    • 为什么我们在项目中可以直接使用$router $store来获取其中的值以及一些方法;
    • 为什么使用这俩插件都是先用Vue.use引入。然后才创建实例,在Vue实例中传入;

    二者其实原理相同,这里我们用Vue-Router来举例,首先我们来看一下它内部install的具体实现:

    class Router {
        constructor(options) {
            ...
        }
    }
    
    Router.install = function(_Vue) {
    
        _Vue.mixin({
            beforeCreate() {
                if (this.$options.router) {
                    _Vue.prototype.$router = this.$options.router
                }
            }
        })
    
    }
    
    export default Router;
    
    • _Vue.mixin全局混入是什么呢?相当于在所有的组件中混入这个方法;
    • beforeCreate是什么呢?当然是Vue的一个生命周期,在create之前执行;

    既然如此,我们大胆的做一个判断。Vue-Router其实是在install函数里面使用了一个全局混入,在beforeCreate这个生命周期触发的时候把this.$options.router挂载到Vue的原型上,这样我们就可以使用this.$router来调用router实例啦。 同学:等一下,stop!!!你说的我很李姐,但是this.$options.router这又是什么东西,从哪来的啊?

    安啦,这咱们才刚刚解决了第一个问题,下面咱们来填第二个坑。

    咱们平时使用Vue-Router,以及定义入口文件的Vue实例大概是这样子

    // router/index.js
    import VueRouter form 'vue-router';
    import Vue from 'vue';
    
    Vue.use(VueRouter);
    
    const _router = [
        ...
    ]
    
    const Router = new VueRouter(_router);
    
    export default Router;
    
    // main.js
    import Vue from 'vue';
    import router from 'router';
    
    new Vue({
        router,
        ...
    }).$mount('#app');
    

    结合最开始的例子,我们先来分析一波。

    • Vue.use()主要是调用插件内部的install方法,并将Vue实例作为参数传入;
    • 上面使用的是this.$options.router,options通常代表的是配置项;
    • 在main.js中我们把Router实例作为配置项传入到Vue实例中

    叮!!!要素察觉,那我们来大胆推测一波。 Vue-Routeruse其实是做了一个全局混入,为了在合适的时间点,获取到Vue根实例配置项中的router实例,执行挂载。紧接着在new Vue()根实例创建的时候,注入router实例,然后触发全局混入中的生命周期,这个时候根实例的配置项this.$options已经包含了router实例,最后完成挂载流程!!! 光这一段的代码也是逻辑缜密,编程思路巧妙,令人直呼内行啊!兄弟萌,把内行打在公屏上,hhhh。 深入理解Vue的插件机制与install

    install在Vue中的内部实现

    看完了常用库install的使用,不知大家是否有收获。接下来热身结束后,我们就可以开始看一看install内部实现了,先上源码。

    export function initUse (Vue: GlobalAPI) {
        // 注册一个挂载在实例上的use方法
        Vue.use = function (plugin: Function | Object) {
            // 初始化当前插件的数组
            const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
            // 如果这个插件已经被注册过了,那就不作处理
            if (installedPlugins.indexOf(plugin) > -1) {
    
                return this
    
            }
    
            ...
            
            // 重点来了哦!!!
            if (typeof plugin.install === 'function') {
            // 当插件中install是一个函数的时候,调用install方法,指向插件,并把一众参数传入
                plugin.install.apply(plugin, args)
    
            } else if (typeof plugin === 'function') {
            // 当插件本身就是一个函数的时候,把它当做install方法,指向插件,并把一众参数传入
                plugin.apply(null, args)
    
            }
            
            // 将插件放入插件数组中
            installedPlugins.push(plugin)
    
            return this
        }
    }
    

    源码这部分写的很简洁,可读性很高。就是在use的时候,判断插件类型,执行install或者插件本身。其实细化一下官网的解释就是,Class类的插件应该暴露一个 install 方法。

    结语

    这次的分享到这里就结束啦,不知道大家对于Vue的插件机制有没有更深入的了解呢?其实开发插件的时候利用install我们可以做很多其他的事儿。 比如Vue-Router在install中其实还注册了Router-viewRouter-link的全局组件。 再次感谢你的阅读。好啦,兄弟萌再见咯! 深入理解Vue的插件机制与install


    起源地下载网 » 深入理解Vue的插件机制与install

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元