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 相关文章推荐
简单的无缝滚动程序-仅几行代码
May 08 Javascript
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
js实现基于正则表达式的轻量提示插件
Aug 29 Javascript
js运动事件函数详解
Oct 21 Javascript
一文让你彻底搞清楚javascript中的require、import与export
Sep 24 Javascript
vue实现购物车抛物线小球动画效果的方法详解
Feb 13 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
Aug 12 Javascript
p5.js绘制创意自画像
Nov 04 Javascript
vue.js循环radio的实例
Nov 07 Javascript
Nuxt v-bind绑定img src不显示的解决
Dec 05 Javascript
Vue 嵌套路由使用总结(推荐)
Jan 13 Javascript
javascript+css实现进度条效果
Mar 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安全性漫谈
2012/06/28 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
vue观察模式浅析
2018/09/25 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
pytorch逐元素比较tensor大小实例
2020/01/03 Python
苹果中国官方网站:Apple中国
2016/07/22 全球购物
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
毕业实习个人鉴定范文
2013/12/10 职场文书
国际会议邀请函范文
2014/01/16 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
销售经理竞聘书
2014/03/31 职场文书
欢度春节标语
2014/07/01 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
大学文艺委员竞选稿
2015/11/19 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android