浅谈Vue.use的使用


Posted in Javascript onAugust 29, 2018

vue.use(plugin, arguments) 语法

参数:plugin(Function | Object)

用法:

如果vue安装的组件类型必须为Function或者是Object

如果是个对象,必须提供install方法

如果是一个函数,会被直接当作install函数执行

install函数接受参数,默认第一个参数为Vue,其后参数为注册组件时传入的arguments

先举个?

我们先来看一个简单的事例

首先我使用官方脚手架新建一个项目vue init webpack vue-demo

然后我创建两个文件index.js plugins.js.

我将这两个文件放置在src/classes/vue-use目录下

接下来对这两个文件进行编写

// 文件: src/classes/vue-use/plugins.js

const Plugin1 = {
  install(a, b, c) {
    console.log('Plugin1 第一个参数:', a);
    console.log('Plugin1 第二个参数:', b);
    console.log('Plugin1 第三个参数:', c);
  },
};

function Plugin2(a, b, c) {
  console.log('Plugin2 第一个参数:', a);
  console.log('Plugin2 第二个参数:', b);
  console.log('Plugin2 第三个参数:', c);
}

export { Plugin1, Plugin2 };
// 文件: src/classes/vue-use/index.js

import Vue from 'vue';

import { Plugin1, Plugin2 } from './plugins';

Vue.use(Plugin1, '参数1', '参数2');
Vue.use(Plugin2, '参数A', '参数B');

然后我们在入口文件main.js引用这段代码

// 文件: src/main.js

import Vue from 'vue';

import '@/classes/vue-use';
import App from './App';
import router from './router';

Vue.config.productionTip = false;

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  render: h => h(App),
});

此时我们执行npm run dev打开8080端口开启开发调试工具可以看到控制台输出以下信息

浅谈Vue.use的使用

...]

从中可以发现我们在plugin1中的install方法编写的三个console都打印出来,第一个打印出来的是Vue对象,第二个跟第三个是我们传入的两个参数。

而plugin2没有install方法,它本身就是一个方法,也能打印三个参数,第一个是Vue对象,第二个跟第三个也是我们传入的两个参数。

那么现在我们是不是大概对Vue.use有一个模糊的猜想~

分析源码

好我们还是不要猜想,直接上源码

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

import { toArray } from '../util/index'

export function initUse (Vue: GlobalAPI) {
 Vue.use = function (plugin: Function | Object) {
  const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
  if (installedPlugins.indexOf(plugin) > -1) {
   return this
  }

  // additional parameters
  const 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)
  }
  installedPlugins.push(plugin)
  return this
 }
}

从源码中我们可以发现vue首先判断这个插件是否被注册过,不允许重复注册。

并且接收的plugin参数的限制是Function | Object两种类型。

对于这两种类型有不同的处理。

首先将我们传入的参数整理成数组 => const args = toArray(arguments, 1)。

(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
}

再将Vue对象添加到这个数组的起始位置args.unshift(this),这里的this 指向Vue对象

如果我们传入的plugin(Vue.use的第一个参数)的install是一个方法。也就是说如果我们传入一个对象,对象中包含install方法,那么我们就调用这个plugin的install方法并将整理好的数组当成参数传入install方法中。 => plugin.install.apply(plugin, args)
如果我们传入的plugin就是一个函数,那么我们就直接调用这个函数并将整理好的数组当成参数传入。 => plugin.apply(null, args)
之后给这个插件添加至已经添加过的插件数组中,标示已经注册过 => installedPlugins.push(plugin)
最后返回Vue对象。

小结

通过以上分析我们可以知道,在我们以后编写插件的时候可以有两种方式。

一种是将这个插件的逻辑封装成一个对象最后将最后在install编写业务代码暴露给Vue对象。这样做的好处是可以添加任意参数在这个对象上方便将install函数封装得更加精简,可拓展性也比较高。

还有一种则是将所有逻辑都编写成一个函数暴露给Vue。

其实两种方法原理都一样,无非第二种就是将这个插件直接当成install函数来处理。

个人觉得第一种方式比较合理。

举个?

export const Plugin = {
  install(Vue) {
    Vue.component...
    Vue.mixins...
    Vue...
    // 我们也可以在install里面执行其他函数,Vue会将this指向我们的插件
    console.log(this) // {install: ...,utils: ...}
    this.utils(Vue)  // 执行utils函数
    console.log(this.COUNT) // 0
  },
  utils(Vue) {
    Vue...
    console.log(Vue) // Vue
  },
  COUNT: 0  
}
// 我们可以在这个对象上添加参数,最终Vue只会执行install方法,而其他方法可以作为封装install方法的辅助函数

const test = 'test'
export function Plugin2(Vue) {
  Vue...
  console.log(test) // 'test'
  // 注意如果插件编写成函数形式,那么Vue只会把this指向null,并不会指向这个函数
  console.log(this) // null
}
// 这种方式我们只能在一个函数中编写插件逻辑,可封装性就不是那么强了

小弟不才,对vue源码的理解暂且到这。欢迎大佬们多指教~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
List the Stored Procedures in a SQL Server database
Jun 20 Javascript
用Javascript实现Sleep暂停功能代码
Sep 03 Javascript
jQuery的选择器中的通配符使用介绍
Mar 20 Javascript
javascript随机之洗牌算法深入分析
Jun 07 Javascript
Javascript的&amp;&amp;和||的另类用法
Jul 23 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
Dec 18 Javascript
js实现简单选项卡与自动切换效果的方法
Apr 10 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
Jul 07 Javascript
Vue仿手机qq的实例代码(demo)
Sep 08 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
Sep 05 Javascript
vue-cli V3.0版本的使用详解
Oct 24 Javascript
基于Vue的商品主图放大镜方案详解
Sep 19 Javascript
微信小程序支付前端源码
Aug 29 #Javascript
微信小程序使用swiper组件实现类3D轮播图
Aug 29 #Javascript
javascript中UMD规范的代码推演
Aug 29 #Javascript
详解webpack自定义loader初探
Aug 29 #Javascript
在vue中使用SockJS实现webSocket通信的过程
Aug 29 #Javascript
微信小程序自定义select下拉选项框组件的实现代码
Aug 28 #Javascript
微信小程序中上传图片并进行压缩的实现代码
Aug 28 #Javascript
You might like
目录,文件操作详谈―PHP
2006/11/25 PHP
PHP 多维数组排序(usort,uasort)
2010/06/30 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
从javascript语言本身谈项目实战
2006/12/27 Javascript
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
Python中的装饰器用法详解
2015/01/14 Python
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
Python中的hypot()方法使用简介
2015/05/18 Python
python算法表示概念扫盲教程
2017/04/13 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
python中web框架的自定义创建
2019/09/08 Python
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
sealed修饰符是干什么的
2012/10/23 面试题
财务会计毕业生自荐信
2013/11/02 职场文书
安全教育心得体会
2013/12/29 职场文书
教师演讲稿大全
2014/05/16 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
学校教学工作总结2015
2015/05/19 职场文书
感动中国何玥观后感
2015/06/02 职场文书
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫