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实现图片渐变切换兼容ie6/Chrome/Firefox
Aug 02 Javascript
Eclipse去除js(JavaScript)验证错误
Feb 11 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
Mar 10 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
Oct 17 Javascript
jquery限定文本框只能输入数字(整数和小数)
Jan 08 Javascript
jQuery EasyUi实战教程之布局篇
Jan 26 Javascript
JS+CSS3模拟溢出滚动效果
Aug 12 Javascript
谈谈JavaScript的New关键字
Aug 26 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
May 11 Javascript
微信小程序实现下拉框功能
Jul 16 Javascript
electron踩坑之remote of undefined的解决
Oct 06 Javascript
WebStorm中如何将自己的代码上传到github示例详解
Oct 28 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
php数组编码转换示例详解
2014/03/11 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
Swoole实现异步投递task任务案例详解
2019/04/02 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
VUE+Element实现增删改查的示例源码
2020/11/23 Vue.js
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
Python中的装饰器用法详解
2015/01/14 Python
Python单链表简单实现代码
2016/04/27 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
公司授权委托书范文
2014/08/02 职场文书
教师个人发展总结
2015/02/11 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers