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 相关文章推荐
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
Nov 20 Javascript
jquery ajax中使用jsonp的限制解决方法
Nov 22 Javascript
js获取url参数代码实例分享(JS操作URL)
Dec 13 Javascript
JavaScript学习笔记之JS函数
Jan 22 Javascript
jQuery调取jSon数据并展示的方法
Jan 29 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
Sep 06 Javascript
Javascript的表单验证-揭开正则表达式的面纱
Mar 18 Javascript
js实现各种复制到剪贴板的方法(分享)
Oct 27 Javascript
vue动态设置页面title的方法实例
Aug 23 Javascript
vue 修改 data 数据问题并实时显示操作
Sep 07 Javascript
基于vue实现微博三方登录流程解析
Nov 04 Javascript
使用 JavaScript 制作页面效果
Apr 21 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
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
php无限遍历文件夹示例分享
2014/03/04 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
2014/05/09 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
lib.utf.js
2007/08/21 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
js日期联动示例
2014/05/02 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
2020/03/29 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
2020/07/21 Javascript
Python动态加载模块的3种方法
2014/11/22 Python
Python实现合并字典的方法
2015/07/07 Python
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
校园安全教育广播稿
2014/02/17 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
小学毕业典礼演讲稿
2014/09/09 职场文书
党支部先进事迹材料
2014/12/24 职场文书
小学英语复习计划
2015/01/19 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
Element实现动态表格的示例代码
2021/08/02 Javascript
Go获取两个时区的时间差
2022/04/20 Golang