vue3第三十六节(自定义插件)

一、首先什么是插件

插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。

主要应用于以下四个方面
1、通过 app.component()app.directive() 注册一到多个全局组件或自定义指令。
2、通过 app.provide() 使一个资源可被注入进整个应用。
3、向 app.config.globalProperties 中添加一些全局实例属性或方法
4、一个可能上述三种都包含了的功能库 (例如 vue-router)。

二、插件的书写形式

一个插件可以是一个拥有 install() 方法的对象,也可以直接是一个安装函数本身。安装函数会接收到安装它的应用实例和传递给 app.use() 的额外选项作为参数

比如:

export default {install(app, config) {// app 实例}
}

1、通过 app.component() 注册全局组件

// myConfirm/index.ts 文件
编写myConfirm 插件,通过install() 注册插件主要调用的方法

import { createVNode, App, AppContext } from 'vue'
import myConfirm from './index.vue'
export default {install(app:App, config:AppContext) {const vnode = createVNode(myConfirm)console.log('=confirm==vnode=', vnode, config)app.component('myConfirm', myConfirm)}
}

// plugins/myConfirm/index.vue 文件
与普通组件一样

<template><div class="my-confrim-container" v-if="isShowConfirm"><div class="my-confirm-main"><div class="my-confrim-title"><span v-if="isShowDefaultTitle">{{ title }}</span><slot name="title"></slot></div><div class="my-confrim-content">{{ content }}<slot name="content"></slot></div><div class="my-confrim-footer"><button class="btn" @click="handleCancle">取消</button><button type="primary" class="btn" @click="handleConfirm">确认</button><slot name="footer"></slot></div></div></div>
</template>
<script setup lang="ts">
interface Prop {isShowConfirm: boolean,isShowDefaultTitle?: boolean,title?: string,content?: string
}
const props = withDefaults(defineProps<Prop>(), {isShowConfirm: false,isShowDefaultTitle: true,title: '提示',content: '请确认是否进行此操作!'
})
const emits = defineEmits<{(e: 'cancel'): void,(e: 'confirm'):void
}>()
const handleCancle = () => {emits('cancel')
}
const handleConfirm = () => {console.log('00=confirm=')emits('confirm')
}
</script><style lang="scss" scoped>
.my-confrim-container{position: fixed;top: 0;left: 0;width: 100%;height: 100%;background: rgba(0,0,0,.5);z-index: 9999;display: flex;justify-content: center;align-items: center;
}
.my-confirm-main{width: 460px;height: auto;background: #fff;border-radius: 2px;box-shadow: 0px 4px 12px 4px rgba(0,0,0,0.16);}
.my-confrim-title{height: 46px;border-bottom: 1px solid #efefef;// line-height:46px;box-sizing: border-box;display: flex;align-items: center;justify-content: center;
}
.my-confrim-content{height: 200px;width: 100%;box-sizing: border-box;padding:12px 16px;display: flex;align-items: center;justify-content: flex-start;
}
.my-confrim-footer{height: 46px;width:100%;display:flex;justify-content: flex-end;align-items:center;border-top:1px solid #efefef;box-sizing: border-box;padding:0 12px;.btn{width: auto;height: 32px;line-height:32px;padding:0 20px;font-size:12px;color: #333;background-color:#fff;border:1px solid #efefef;margin-left:12px;cursor: pointer;&[type="primary"]{background: #1890ff;color: #fff;border-color: #1890ff;}}
}
</style>

// 在 main.ts
若要全局使用 myConfirm 组件,需要通过app.use(),使用改插件,此时会自动执行 插件中的install() 方法

import { createApp } from 'vue'
import myConfirm from './plugins/myConfirm/index'
const app = createApp(App)
app.use(myConfirm)

并且 Vue.use会自动阻止注册相同插件多次,届时只会注册一次该插件。
使用:

<template><div class="my-plugin">This is a demo of the plugin<my-confirm :isShowConfirm="isShowConfirm"@cancel="handleCancle"@confirm="handleConfrim"/><hr/><el-button @click="isShowConfirm = true">open confirm</el-button></div>
</template><script setup>
import { ref, onActivated, inject, getCurrentInstance } from "vue"// 以插件形式组成全局组件
const isShowConfirm = ref(false)
const handleCancle = () => {console.log('==handleCancle==')isShowConfirm.value = false
}
const handleConfrim = () => {const myPromise = new Promise((reslove, reject) => {setTimeout(() => {reslove("成功");}, 300);})console.log('===myPromise==', myPromise)myPromise.then(res => {console.log('===res==', res)isShowConfirm.value = false}).catch(err => {console.log('===err==', err)})
}
</script>

效果如图:
请添加图片描述

2、通过 app.provide() 使一个资源可被注入进整个应用

// 编写一个全局loading
// plugins/loading/loading.js 文件

import { createVNode, render, provide } from 'vue'
import myLoading from './loading.vue';
export default {install(app, options) {// appconsole.log('加载插件', app)// 使用 createVNode 创建虚拟DOMconst vnode = createVNode(myLoading)console.log('=vnode==', vnode)// 虚拟DOM 渲染至 body下面render(vnode, document.body)const  $myLoading = {hidden: () => {vnode?.component?.exposed?.hidden()},show: () => {vnode?.component?.exposed?.show()}}// 由于 vue3 中不建议这种直接挂在全局写法,可以使用依赖注入替代app.config.globalProperties.$myLoading =  $myLoadingapp.provide('$myLoading', $myLoading)}
}

// plugins/loading/loading.vue 文件

<template><div class="my-loading" v-if="isShowLoading">loading……</div>
</template>
<script setup>
import { ref } from "vue"
const isShowLoading = ref(false)
const hidden = () => {console.log('===hidden==')isShowLoading.value = false
}
const show = () => {console.log('===show==')isShowLoading.value = true
}
// 通过 defineExpose子组件暴露出属性 方法
defineExpose({show,hidden,isShowLoading
})
</script>
<style lang="scss" scoped>
.my-loading{position:fixed;top:0;left:0;width: 100%;height:100%;background-color: rgba(0,0,0,0.5);font-size: 14px;color: #fff;text-align: center;display: flex;align-items: center;justify-content: center;
}
</style>

同样使用 app.use() 挂载
main.ts 文件中

import { createApp } from 'vue'
const app = createApp(App)
app.use(myLoading)

使用的时候
inject() 对应的是 provide()
getCurrentInstance() 对应的是获取 app.config.globalProperties 中的方法
因:getCurrentInstance()vue 3.3X 以上属于内置方法,所以建议使用依赖注入方案;

<template><div class="my-plugin">This is a demo of the plugin<my-confirm :isShowConfirm="isShowConfirm"@cancel="handleCancle"@confirm="handleConfrim"/><hr/><el-button @click="isShowConfirm = true">open confirm</el-button></div>
</template><script setup>
import { ref, onActivated, inject, getCurrentInstance } from "vue"
// 注册在 body 中组件方法
let $myLoading = inject('$myLoading')
console.log('===', $myLoading)
// 获取
// const conext = getCurrentInstance().appContext.config.globalProperties
// console.log('==conext==', conext)
$myLoading.show()
setTimeout(() => {$myLoading.hidden()
}, 3500)</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/844863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【乐吾乐3D可视化组态编辑器】数据集与数据订阅

对于物联网或者数字孪生项目来说&#xff0c;单纯的静态场景展示是无法满足需求的&#xff0c;它需要系统可以提供一种方式将后台数据与模型数据关联&#xff0c;当后台数据推送更新时&#xff0c;模型数据能自动同步。接下来&#xff0c;我们将向您介绍如何在系统中实现这一需…

Linux--线程的分离、线程库的地址关系的理解、线程的简单封装(二)

线程系列&#xff1a; 线程的认识&#xff1a;讲解线程的概念和线程的基本控制 线程的分离 线程分离是指将一个线程从主线程中分离出来&#xff0c;使其能够独立运行。当一个线程被设置为分离状态时&#xff0c;它结束时系统会自动回收其资源&#xff0c;而不需要其他线程使用…

ArcGIS空间数据处理、空间分析与制图;PLUS模型和InVEST模型的原理,参量提取与模型运行及结果分析;土地利用时空变化以及对生态系统服务的影响分析

工业革命以来&#xff0c;社会生产力迅速提高&#xff0c;人类活动频繁&#xff0c;此外人口与日俱增对土地的需求与改造更加强烈&#xff0c;人-地关系日益紧张。此外&#xff0c;土地资源的不合理开发利用更是造成了水土流失、植被退化、水资源短缺、区域气候变化、生物多样性…

北京大学第一医院与智源研究院共同发布基于可信执行环境的AI医学影像挑战赛

肾动脉狭窄是导致继发性高血压及肾功能不全的常见原因&#xff0c;而目前针对肾动脉狭窄功能学的评估尚处于探索阶段。数据保护和可信计算环境是目前人工智能技术应用于临床研究的一大瓶颈。北京大学第一医院与北京智源人工智能研究院心脏AI 联合研究中心特发布基于可信执行环境…

Ubuntu22.04之解决:Flameshot无法截图问题(二百三十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Ant design vue的表格双击编辑功能(即双击开始编辑并自动获得焦点,失去焦点时完成编辑)

本文基于Ant Design Vue官方网站的表格&#xff08;可编辑单元格&#xff09;&#xff08;表格 Table - Ant Design Vue (antdv.com))中的样板代码获得双击编辑且获得焦点、失去焦点时完成编辑的功能。 要点&#xff1a; &#xff08;1&#xff09;双击时候实现编辑&#xff…

如何使用Cloudways搭建WordPress网站(附最新Cloudways优惠码)

如今&#xff0c;搭建网站已经变得非常简单&#xff0c;这主要得益于开源的CMS建站系统的兴起。即使是不懂编程的人也能轻松搭建自己的网站&#xff0c;这些CMS系统提供了丰富的主题模板和插件&#xff0c;使用户可以通过简单的拖放和配置操作来建立自己的网站。 WordPress是目…

子网划分案例

4.2子网划分 “有类编址”的地址划分过于死板&#xff0c;划分的颗粒度太大&#xff0c;会有大量的主机号不能被充分利用&#xff0c;从而造成了大量的IP地址资源浪费。因此可以利用子网划分来减少地址浪费&#xff0c;即VLSM (Variable Length Subnet Mask)&#xff0c;可变长…

国内前十款专业外盘期货交易app软件排名盘点(综合版)

随着社会经济的不断发展&#xff0c;现在投资者倾向于投资各种项目以获取超额收益。在选择外盘期货交易app软件时&#xff0c;有几个关键的因素需要考虑。首先是软件的可靠度和安全度&#xff0c;因为交易涉及到实际资金。因此&#xff0c;需要选择具备专业资质、经验丰富、充分…

Android下HWC以及drm_hwcomposer普法(上)

Android下HWC以及drm_hwcomposer普法(上) 引言 按摩得全套&#xff0c;错了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果对Android图形栈有一定研究的童鞋们应该知道它是Android提供的一个的图形后端合成处理HAL模块的实现。但是在分析这个之前…

汽车悬架分为哪几类

汽车悬架分为哪几类 1)汽车的悬架系统可根据结构分为两种:独立悬架和非独立悬架,独立悬架根据构造又可以分为CDC运动悬架(CDC电磁悬架系统)和空气悬架; 2)当前比较火热的空气悬架,是独立悬架的一种; 3)前轮主要使用麦弗逊式独立悬架 和 双叉臂悬架,后轮主要使用多…

倒角距离【Chamfer Distance】

倒角距离&#xff08;chamfer distance&#xff09;是用于评估两组点之间的相似度的度量。给定两个点集 A 和 B&#xff0c;倒角距离定义为 A 中每个点到 B 中最近邻点的距离之和&#xff0c;加上 B 中每个点到 A 中最近邻点的距离之和。它用于各种应用&#xff0c;包括计算机视…

每期一个小窍门 k8s版本的 Prometheus + grafana + alertmanager 三件套部署监控落地

首先部署prometheus 首先是pvc apiVersion: v1 kind: PersistentVolumeClaim metadata:name: prometheus-data-pvcnamespace: monitor spec:accessModes:- ReadWriteManystorageClassName: "data-nfs-storage"resources:requests:storage: 10Gi然后接着 cluster-ro…

CSS+Canvas绘制最美星空(一闪一闪亮晶晶效果+流星划过)

1.效果 2.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;padding: 0;ov…

20 VUE学习:插件

介绍 插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。下面是如何安装一个插件的示例&#xff1a; import { createApp } from vueconst app createApp({})app.use(myPlugin, {/* 可选的选项 */ })一个插件可以是一个拥有 install() 方法的对象&#xff0c;也可以直接…

CNAS软件测试公司作用分享,如何获取CNAS软件测试报告?

在软件测试行业&#xff0c;CNAS认可和CNAS软件测试公司是不可忽视的关键词。CNAS认可是指中国合格评定国家认可委员会对特定领域组织、机构或公司的能力和资质进行的认可过程。该认可遵循国际标准及相关法律法规&#xff0c;是评定组织或实验室技术能力和专业水平的权威认可&a…

【考研数学】李艳芳900比李林880难吗?值得做吗?

差不多&#xff0c;只能说基础没搞好刷这两个都很费劲 李艳芳900题把每个章节题目划分为ABC三个难度级别&#xff0c;题目选取的难度较大也比较新颖&#xff0c;计算量也非常接近考研趋势&#xff0c;原创性很高&#xff0c;比较适合过完一轮的同学继续做补充和强化 880算是比…

Java 数组的基本使用【Array】

目录 含义语法格式语句特点数组的长度数组的元素打印数组显示数组数组的复制扩展示例【12】 含义 数组&#xff08;array&#xff09;是一种最简单的复合数据类型&#xff0c;它是有序数据的集合&#xff0c;数组中的每个元素具有相同的数据类型&#xff0c;可以用一个统一的数…

cesium绘制编辑区域

npm 安装也是可以的 #默认安装最新的 yarn add cesium#卸载插件 yarn remove cesium#安装指定版本的 yarn add cesium1.96.0#安装指定版本到测试环境 yarn add cesium1.96.0 -D yarn install turf/turf token记得换成您自己的&#xff01;&#xff01;&#xff01; <t…

如何培养元技能?

如何培养元技能&#xff1f; 一、引言 在当今社会&#xff0c;仅仅依靠某一专业技能是远远不够的。我们需要拓宽自己的能力和视野&#xff0c;从而更好地应对日新月异的社会发展和工作需求。在这个过程中&#xff0c;培养元技能变得至关重要。元技能不仅有助于我们在各个领域中…