直接开始分析源码

// Vue源码文件路径:src/core/global-api/use.js

import { toArray } from '../util/index'
//initUse函数接受也一个参数,参数值为Vue实例
export function initUse (Vue: GlobalAPI) {  //Vue.use函数接受的第一个参数为一个函数或者一个对象(注意:如果是对象,对象里面一定个要有install属性名,且值为一个函数)
Vue.use = function (plugin: Function | Object) {   //声明变量installedPluguns,并指向this._installedPluguns
const installedPlugins = (this._installedPlugins || (this._installedPlugins = [])) //判断插件是否注册过,如果已经注册了,不允许重复注册。
if (installedPlugins.indexOf(plugin) > -1) {
return this
} // 把通过Vue.use()传入的参数,除开第一个,从第二个参数开始全部取出存储在args中,并向args数组开头添加一个元素,此元素为Vue实例,(所以plugin对应的方法在执行的时候,第一个参数永远是Vue实例)
const args = toArray(arguments, 1)
args.unshift(this)   //开始执行要注册的插件函数
  //1.如果传入的插件是一个对象,且对象中有install属性,且此属性对应的值是一个函数
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args)
  //2.如果传入的插件直接就是一个函数
} else if (typeof plugin === 'function') {
plugin.apply(null, args)
}   // 把刚刚注册的插件添加到installedPlugins中,用作记录是否注册过此插件
installedPlugins.push(plugin)
return this
}
}

顺便贴一下(toArray源码)

// Vue源码文件路径:src/core/shared/util.js

export function toArray (list: any, start?: number): Array<any> {
start = start || 0
let i = list.length - start
const ret: Array<any> = new Array(i)
while (i--) {
ret[i] = list[i + start]
}
return ret
}

  

  

总结:

  第一,判断这个插件是否被注册过,如果已经注册了,不允许重复注册。

  第二,接收的plugin参数的限制是Function | Object两种类型之一。

以后编写插件的时候可以有两种方式。
一种是将这个插件的逻辑封装成一个对象,最后在install编写业务代码暴露给Vue对象。
还有一种则是将所有逻辑都编写成一个函数暴露给Vue。
两种方法原理都一样,第二种就是将这个插件直接当成install函数来处理。

最新文章

  1. python select 实现
  2. c/c++ printf
  3. ACM之Java速成(2)
  4. Linux清除磁盘上的RAID信息
  5. 【Unity3D】生成工程报错解决—UnityEditor.HostView:OnGUI() Error building Player: Couldn&#39;t build player because of unsupported data on target platform.
  6. SQL表连接查询
  7. MYSQL 体系结构图 log commit
  8. poj1011 Sticks(dfs+剪枝)
  9. Codeforces Round #346 (Div. 2) D Bicycle Race
  10. Unity3d中Dictionary和KeyValuePair的使用
  11. Spring Http Invoker使用简介
  12. java课后作业总结
  13. MUI---上传头像功能实现
  14. 【Android实验】组件通信Intent
  15. Java之Socket网络编程实践
  16. 【模板】 全排列 &amp;&amp; 有重复元素的全排列
  17. 2.2 IPython基础
  18. T-SQL数据库备份
  19. “全栈2019”Java异常第十三章:访问异常堆栈跟踪信息
  20. 基于ASP.NET Core 创建 Web API

热门文章

  1. 阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)
  2. 5.7.27版本mysql新增用户
  3. 【DataBase】H2 DateBase与项目集成
  4. c# 子线程与主线程通信二
  5. 文件描述符FD的含义/文件句柄
  6. sonar:查询全部项目的bug和漏洞总数(只查询阻断/严重/主要级别)
  7. 【深度学习与神经网络】深度学习的下一个热点——GANs将改变世界
  8. windows环境下安装: VMware 15 + centos 7
  9. 仔细看参数--NGINX之tcp_nodelay
  10. Ubuntu 中改变文件的默认打开方式(转)