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 相关文章推荐
Discuz! 6.1_jQuery兼容问题
Sep 23 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
Dec 16 Javascript
javascript进行四舍五入方法汇总
Dec 16 Javascript
JavaScript对数字的判断与处理实例分析
Feb 02 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
Aug 03 Javascript
jQuery实现的placeholder效果完整实例
Aug 02 Javascript
AngularJS Phonecat实例讲解
Nov 21 Javascript
laydate.js日期时间选择插件
Jan 04 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
Aug 25 Javascript
JavaScript复制内容到剪贴板的两种常用方法
Feb 27 Javascript
angular5 httpclient的示例实战
Mar 12 Javascript
基于Vue实现拖拽效果
Apr 27 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二维数组用键名分组相加实例函数
2013/11/06 PHP
PHP中文编码小技巧
2014/12/25 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
jquery实现下载图片功能
2019/07/18 jQuery
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
2019/12/10 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
Python修改Excel数据的实例代码
2013/11/01 Python
python使用分治法实现求解最大值的方法
2015/05/12 Python
python编程实现希尔排序
2017/04/13 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
python异步Web框架sanic的实现
2020/04/27 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
京东奢侈品:全球奢侈品牌
2018/03/17 全球购物
实习教师自我鉴定
2013/09/27 职场文书
广告创意求职信
2014/03/17 职场文书
财务负责人任命书
2014/06/06 职场文书
文案策划专业自荐信
2014/07/07 职场文书
2015年计划生育责任书
2015/05/08 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
python使用shell脚本创建kafka连接器
2022/04/29 Python
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js