VUE源码分析之全局函数use原理

Vue提供了全局方法use, Vue.use(plugin)。Vue官网对此有描述:

安装 Vue.js 插件。如果插件是一个对象,必须提供 install 方法。如果插件是一个函数,它会被作为 install 方法。install 方法调用时,会将 Vue 作为参数传入。

该方法需要在调用 new Vue() 之前被调用。

当 install 方法被同一个插件多次调用,插件将只会被安装一次。

 

 

我们按照官网描述写一个小例子:

​
<!DOCTYPE html>
<html>
 
<head>
 
    <meta charset="utf-8">
    <title>vue demo</title>
 
</head>
 
 
<body>
 
<script src="./vue.js"></script>
 
<div id="app">

</div>
 
<script>
    var myPlugin = {};
    myPlugin.install = function(_Vue){
        console.log("install args 0: " + arguments[0]);
        console.log("install args 1: " + arguments[1]);
        console.log("install args 2: " + arguments[2]);
        console.log("install Vue version: " + _Vue.version);
    }
    Vue.use(myPlugin, "para1", "para2");
    Vue.use(myPlugin, "para3", "para4");
    new Vue({
        el:"#app",
        data:{
            message: "hello"
        }
    })
    
</script>
 
</body>
</html>
 
 
​

首先定义一个myPlugin 对象,并给这个对象添加一个install方法。安装官网描述必须提供这个install方法。我们调用Vue全局方法use, 把myPlugin对象作为参数传递给use参数,并传递了其他参数。

通过打印我们可以看到 :

install args 0:     会打印出Vue的构造函数

intall args 1 :      会打印出para1 

intall args 2 :      会打印出para2 

intall Vue version :      会打印出Vue的版本号

而para3,para4 没有打印, 从打印看出 install 方法被同一个插件多次调用,插件将只会被安装一次。

 

我们看看Vue.use 这个全局函数怎么实现的。

    Vue.use = function (plugin) {
      var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
      if (installedPlugins.indexOf(plugin) > -1) {
        //这个就是检测插件是否已经被注入了,如果已注入就直接返回
        return this
      }

      // additional parameters
      var args = toArray(arguments, 1); //解析出第一个形参之后的其他形参
      args.unshift(this);  //把Vue构造函数插入到args数组中的第一个元素之前
      if (typeof plugin.install === 'function') {
        plugin.install.apply(plugin, args); //调用plugin 对象的install方法
      } else if (typeof plugin === 'function') {
        plugin.apply(null, args);
      }
      installedPlugins.push(plugin);
      return this
    };

代码很简单,直接在代码中注释了。关键点在于args.unshift(this) 把Vue给插入,这个插件就可以使用Vue了。

也就解释了在install方法中 _Vue.version可以打印出Vue的版本号了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值