Vue.use()在new Vue() 之前使用的原因浅析


Posted in Javascript onAugust 26, 2019

使用Vue前端框架开发有些时间了,官方文档对于插件开发也有详细的介绍。最近强迫症犯了,老在想为什么Vue.use函数执行,要在Vue实例化即new Vue(options)之前。解铃还须系铃人,这个问题只能通过看源码解决,于是。。。

先看Vue.use做了什么

Vue.use = function (plugin: Function | Object) {
  //Vue构造函数上定义_installedPlugins 避免相同的插件注册多次
  const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
  // import是单例模式
  //所以plugin不论是Fuction还是Object同一个插件都是同一个
  if (installedPlugins.indexOf(plugin) > -1) {
   return this
  }

  // additional parameters
  const args = toArray(arguments, 1)
  // Vue作为第一个参数传递给插件
  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 // 返回的是this,可以链式调用
 }

do:

  1. 检查插件是否已经注册,相同的插件只注册一次
  2. 将Vue构造函数作为第一个参数,作为插件注册调用
  3. 根据插件形式选择调用plugin.install还是plugin
  4. 存储已注册插件,用于插件是否已注册检验
Vue.prototype._init中合并options
Vue.prototype._init = function (options?: Object) {
  const vm: Component = this
  // a uid
  vm._uid = uid++
  let startTag, endTag
  ...
  vm.$options = mergeOptions(
    resolveConstructorOptions(vm.constructor),
    options || {},
    vm
   )
   ...
   // 挂载到dom上
  if (vm.$options.el) {
   vm.$mount(vm.$options.el)
  }
}

new Vue(options)时首先会执行this._init进行初始化,将Vue上的属性和options进行合并,然后在进行事件、生命周期等的初始化。beforeCreate,created生命周期的hook函数也是在这里进行调用

如果Vue.use在new Vue()之后执行,this._init()时你使用的插件的内容还没有添加到Vue.options.components、Vue.options.directives、Vue.options.filters等属性中。所以新初始化的Vue实例中也就没有插件内容

总结

以上所述是小编给大家介绍的Vue.use()在new Vue() 之前使用的原因浅析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
5款Javascript颜色选择器
Oct 25 Javascript
javascript 窗口加载蒙板 内嵌网页内容
Nov 19 Javascript
多种方法实现load加载完成后把图片一次性显示出来
Feb 19 Javascript
用C/C++来实现 Node.js 的模块(二)
Sep 24 Javascript
Javascript BOM学习小结(六)
Nov 26 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
Dec 01 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
Dec 04 Javascript
jQuery增加、删除及修改select option的方法
Aug 19 Javascript
Bootstrap 3 进度条的实现
Feb 22 Javascript
JS+canvas绘制的动态机械表动画效果
Sep 12 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
Dec 24 Javascript
修改NPM全局模式的默认安装路径的方法
Dec 15 Javascript
微信小程序事件 bindtap bindinput代码实例
Aug 26 #Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
Aug 26 #Javascript
微信小程序实现手势滑动效果
Aug 26 #Javascript
详解nuxt 微信公众号支付遇到的问题与解决
Aug 26 #Javascript
Vue路由之JWT身份认证的实现方法
Aug 26 #Javascript
Vue中跨域及打包部署到nginx跨域设置方法
Aug 26 #Javascript
js实现跟随鼠标移动的小球
Aug 26 #Javascript
You might like
php提交表单发送邮件的方法
2015/03/20 PHP
PHP单例模式详细介绍
2015/07/01 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
javascript 写类方式之四
2009/07/05 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
python文本数据处理学习笔记详解
2019/06/17 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
html5本地存储 localStorage操作使用详解
2016/09/20 HTML / CSS
婴儿地球:Baby Earth
2018/12/25 全球购物
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
大学生村官考核材料
2014/05/23 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
师德师风自查总结
2014/10/14 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
单位介绍信格式
2015/01/31 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
Python中for后接else的语法使用
2021/05/18 Python