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与CSS复习(二)
Jun 29 Javascript
jquery乱码与contentType属性设置问题解决方案
Jan 07 Javascript
jquery实现清新实用的网页菜单效果
Aug 28 Javascript
jQuery简单实现两级下拉菜单效果代码
Sep 15 Javascript
原生JS实现图片网格式渐显、渐隐效果
Jun 05 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 Javascript
vue几个常用跨域处理方式介绍
Feb 07 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
Aug 10 Javascript
Vue的路由及路由钩子函数的实现
Jul 02 Javascript
微信小程序开发之转发分享功能
Oct 22 Javascript
Vue页面切换和a链接的本质区别详解
Nov 12 Javascript
Javascript执行上下文顺序的深入讲解
Nov 04 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生成动态验证码gif图片
2015/10/19 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
JS控制表格隔行变色
2006/06/26 Javascript
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
js实现登录验证码
2016/12/22 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
优化Python代码使其加快作用域内的查找
2015/03/30 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
专题组织生活会方案
2014/06/15 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
2014年大学团支部工作总结
2014/12/02 职场文书
五年级学生评语大全
2014/12/26 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL