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 相关文章推荐
在Javascript中定义对象类别
Dec 22 Javascript
jQuery中文入门指南,翻译加实例,jQuery的起点教程
Jan 13 Javascript
js中settimeout方法加参数
Feb 28 Javascript
Prototype框架详解
Nov 25 Javascript
JavaScript阻止表单提交方法(附代码)
Aug 15 Javascript
JS动态添加的div点击跳转到另一页面实现代码
Sep 30 Javascript
vue 路由页面之间实现用手指进行滑动的方法
Feb 23 Javascript
微信小程序用户信息encryptedData详解
Aug 24 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
Aug 27 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 Javascript
vue使用codemirror的两种用法
Aug 27 Javascript
JS轮播图的实现方法2
Aug 25 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 mysql 判断update之后是否更新了的方法
2012/01/10 PHP
Yii分页用法实例详解
2014/12/04 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
JavaScript的21条基本知识点
2014/03/04 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
python如何对实例属性进行类型检查
2018/03/20 Python
python3处理含有中文的url方法
2018/05/10 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
Jupyter加载文件的实现方法
2020/04/14 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
NBA欧洲商店(西班牙):NBA Europe Store ES
2019/04/16 全球购物
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
公司薪酬管理制度
2014/01/31 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
商品陈列协议书
2014/09/29 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
安全生产奖惩制度
2015/08/06 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
总结Pyinstaller打包的高级用法
2021/06/28 Python
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS