分析一下Vue.use的源码


本文摘自PHP中文网,作者青灯夜游,侵删。

有过vue开发经验的,对于vue.use并不陌生。当使用vue-resource或vue-router等全局组件时,必须通过Vue.use方法引入,才起作用。那么vue.use在组件引入之前到底做了那些事情呢?

先上vue.use源码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Vue.use = function (plugin) {

    /* istanbul ignore if */

    if (plugin.installed) {

      return

    }

    // additional parameters

    var args = toArray(arguments, 1);

    args.unshift(this);

    if (typeof plugin.install === 'function') {

      plugin.install.apply(plugin, args);

    } else if (typeof plugin === 'function') {

      plugin.apply(null, args);

    }

    plugin.installed = true;

    return this

  };

假设我们通过Vue.use引入一个插件plugin(该插件可以暂时理解为一个变量或参数),即Vue.use(plugin);

首先判断传入的参数plugin的属性installed是否存在,如果存在且逻辑值为真,那么直接返回,后边的代码就不会在执行,这个判断的作用是什么呢?后边会讲到。

我们先假设plugin的属性installed不存在或为假,那么继续往下执行

1

var args = toArray(arguments, 1)

执行了一个toArray方法,toArray接收了两个参数,arguments为Vue.use方法传入的参数集合,例如Vue.use(a,b,c),那么arguments类似于[a,b,c](说明:arguments只是类数组,并不是真正的数组)

此处因为我们只引入一个参数plugin,所以arguments类似于[plugin]。

toArray的作用是什么呢?看源码。

1

2

3

4

5

6

7

8

9

function toArray (list, start) {

  start = start || 0;

  var i = list.length - start;

  var ret = new Array(i);

  while (i--) {

    ret[i] = list[i + start];

  }

  return ret

}

当执行toArray(arguments,1),会生成一个新数组ret,长度 = arguments.length-1,然后进行while循环,依次倒序把arguments的元素赋值给ret,因为ret比arguments长度少1.

所以最终等同于arguments把除了第一个元素外的其余元素赋值给ret。toArray主要作用就是把类数组转化为真正的数组,这样才能调用数组的方法。

因为此处我只引入一个plugin参数,即arguments=[plugin],所以toArray返回为空数组[]。

接着往下执行,args.unshift(this),等同于[].unshift(Vue),即args = [Vue];

然后执行

1

2

3

4

5

if (typeof plugin.install === 'function') {

      plugin.install.apply(plugin, args);

    } else if (typeof plugin === 'function') {

      plugin.apply(null, args);

    }

此处判断plugin的install是否为函数,如果为函数,立即执行pluign.install方法,install方法传入的参数为args内数组元素,即install接受的第一个参数为Vue.

如果plugin的install不是函数,那么判断plugin本身是否为函数,如果为函数,那么执行plugin函数,且参数为args内数组元素。

最后设置plugin.installed为true。设置plugin.installed为true的作用是避免同一个插件多次执行安装,比如Vue.use(plugin)执行一次之后,installed为true,再次执行的话走到第一步判断就返回了。

综上所述,Vue.use的作用其实就是执行一个plugin函数或者执行pluign的install方法进行插件注册,并且向plugin或其install方法传入Vue对象作为第一个参数,use的其他参数作为plugin或install的其他参数。

举个简单的例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

import Vue from 'vue'

function test(a){

   console.log(a);//Vue

}

function test1(a,b){

  console.log(a,b);//Vue hello

}

let oTest = {

   install:function(a,b){

      console.log(a,b);//Vue hello1

   }

}

Vue.use(test);

Vue.use(test1,'hello');

Vue.use(oTest,'hello1')

console.log(oTest);

//{

  install:function(){...},

  installed:true

}

相关推荐:

2020年前端vue面试题大汇总(附答案)

vue教程推荐:2020最新的5个vue.js视频教程精选

更多编程相关知识,请访问:编程入门!!

以上就是分析一下Vue.use的源码的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

vue.js的两个核心是什么

vue.js全家桶是什么

怎么检查vue.js是否安装成功了

vue.js中如何注册组件

vue.js是一种框架吗

vue.js与微信小程序区别是什么

vue中值得关注的21个开源项目(推荐)

安装vue.js需要安装什么

vue.js如何打包放到服务器

5个好用的vue.js库推荐

更多相关阅读请进入《vue.js》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...