当前位置: 首页 > news >正文

vue3插件原理

概览

vue3的生态圈提供了许多方便的插件或者工具,比如piniavue-routerElement Plus等,使用插件的写法一般如下:

const app = createApp(App);app.use(pinia);
app.use(router);
app.use(ElementPlus, { locale }); // 第二个参数:{locale} 为传给插件的参数

源码分析

vue3use方法的实现

打印createApp的返回值app,如下图所示,

在这里插入图片描述

其实现如下:

        use(plugin, ...options) {if (installedPlugins.has(plugin)) {warn2(`Plugin has already been applied to target app.`);} else if (plugin && isFunction(plugin.install)) {installedPlugins.add(plugin);plugin.install(app, ...options);} else if (isFunction(plugin)) {installedPlugins.add(plugin);plugin(app, ...options);} else if (true) {warn2(`A plugin must either be a function or an object with an "install" function.`);}return app;},

实现的源码中,installedPlugins是个WeakSet类型的局部变量,先是判断插件plugin是否被安装过,插件只需要安装一次,不能重复安装;然后判断插件是否存在install方法,若存在就调用plugin.add方法,并将console.log打印出来的app变量的值会作为参数传给plugin;若plugin不存在install方法,且其自身就是个函数类型,就调用plugin(app),否则报错;最后返回app

vue3中接收插件的就这段代码,可以说理解起来非常简单,基于此,就可以在插件plugin中拿到app这个实例对象了。

插件中的install

在 Pinia 部分源码浅析一文中有提到 Pinia相关的实现

我们可以自己写个 Plugin 测试下,其本质上就是一个包含install属性方法的一个对象而已。

如下:

const plugin = {install: (app) => {console.log("🚀 ~ app:", app);},
};
export default plugin;

打印出来如下:
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 监控领域的物理对抗攻击综述——Physical Adversarial Attacks for Surveillance: A Survey
  • C语言程序设计-联系篇
  • C++基础语法:异常处理(三)
  • 一起搭WPF界面之View的简单设计一
  • 文件硬盘数据销毁:守护信息安全的关键一步,文档销毁 数据销毁
  • 【Java】Java 设计模式之工厂模式与策略模式
  • 07 - procfs
  • Java中IO基础文本数据处理:BufferedReader 和 BufferedWriter
  • CSI 插件如何注册到 kubelet 的
  • 【网络基础】探索 NAT 技术:IP 转换、NAPT、NAT穿越及代理服务器
  • Git实战精粹
  • 百度搜索的RLHF性能优化实践
  • APP渠道来源方案探索
  • 在 macOS 上升级 Ruby 版本的几种方法
  • vue事件监听
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【面试系列】之二:关于js原型
  • 230. Kth Smallest Element in a BST
  • canvas绘制圆角头像
  • Linux各目录及每个目录的详细介绍
  • 从零开始学习部署
  • 对JS继承的一点思考
  • 关于springcloud Gateway中的限流
  • 浅谈Golang中select的用法
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序:实现悬浮返回和分享按钮
  • # 计算机视觉入门
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (1)Jupyter Notebook 下载及安装
  • (13)DroneCAN 适配器节点(一)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (175)FPGA门控时钟技术
  • (20050108)又读《平凡的世界》
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)LINQ之路
  • (转)nsfocus-绿盟科技笔试题目
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)Unity3DUnity3D在android下调试
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET Framework 3.5安装教程
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET和.COM和.CN域名区别
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @EventListener注解使用说明
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [023-2].第2节:SpringBoot中接收参数相关注解
  • [22]. 括号生成
  • [AHOI2009]中国象棋 DP,递推,组合数