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 相关文章推荐
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
Apr 24 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
Oct 29 Javascript
JavaScript中的object转换成number或string规则介绍
Dec 31 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
Oct 09 Javascript
jQuery Mobile操作HTML5的常用函数总结
May 17 Javascript
JS扩展类,克隆对象与混合类实例分析
Nov 26 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
Mar 15 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
May 02 Javascript
VSCode 配置React Native开发环境的方法
Dec 27 Javascript
Vue触发式全局组件构建的方法
Nov 28 Javascript
Ajax请求时无法重定向的问题解决代码详解
Jun 21 Javascript
Vue.js组件使用props传递数据的方法
Oct 19 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
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
腾讯QQ php程序员面试题目整理
2010/06/08 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
Python 对输入的数字进行排序的方法
2018/06/23 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
Python线程threading模块用法详解
2020/02/26 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
教育学专业毕业生的自我评价
2013/11/21 职场文书
留学推荐信怎么写
2014/01/25 职场文书
如何写一封打动人心的求职信
2014/02/17 职场文书
志愿者活动总结
2014/04/28 职场文书
优秀教师演讲稿
2014/05/06 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
党章培训心得体会
2014/09/04 职场文书
水浒传读书笔记
2015/06/25 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
使用MybatisPlus打印sql语句
2022/04/22 SQL Server