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

vue3+ts自定义插件

使用:

<template lang="html">
  <div></div>
</template>
<script lang="ts" setup>
import { ref, reactive, getCurrentInstance } from "vue";
const instance = getCurrentInstance();
console.log(instance?.proxy, "instance?.proxy?");
instance?.proxy?._loading.show();
setTimeout(() => {
  instance?.proxy?._loading.hide();
}, 5000);
</script>
<style lang="scss"></style>

全局组件:

loading/index.ts

import { createVNode,VNode,render, type App } from "vue";
import   Loading  from  "./index.vue"
export default {
    install(app: App) {
        const Vnode: VNode = createVNode(Loading);
        render(Vnode, document.body);
        app.config.globalProperties._loading = {
            show: Vnode.component?.exposed?.show,
            hide:Vnode.component?.exposed?.hide
        }
        
    console.log(app,'222',Vnode.component?.exposed)
    }
}

loading/index.vue

<template>
  <div v-if="isShow" class="loading">loading...</div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
const isShow = ref<boolean>(false);
const show = () => (isShow.value = true);
const hide = () => (isShow.value = false);
defineExpose({
  hide,
  show,
  isShow,
});
</script>

<style>
.loading {
  background: black;
  opacity: 0.8;
  font-size: 30px;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  color: white;
  position: absolute;
  width: 100vw;
}
</style>

在main.ts中控制

import Loading from "./components/loading";

export const app = createApp(App);
import { myUse } from "./myUse";
myUse(Loading)
// app.use(Loading);

//不提示可以设置属性
type Lod = {
  show: () => void,
  hide:()=>void
}
declare module "@vue/runtime-core" {
  export interface ComponentCustomProperties{
    _loading:Lod
  }
}

myUser.ts

import { App } from "vue";
import  {app} from  "./main"
interface Use{
    install:(app:App,...options:any[])=>void
}


const installList = new Set();

export function myUse<T extends Use>(plugin: T, ...options: any[]) {
    if (installList.has(plugin)) {
        console.error("注册过了",plugin)
    } else {
        plugin.install(app,...options);
        installList.add(plugin)
    }
     
}

http://www.kler.cn/a/160432.html

相关文章:

  • Ceph 中Crush 算法的理解
  • 基于Java Web的传智播客crm企业管理系统的设计与实现
  • redis bind 127.0.0.1和bind 10.34.56.78的区别
  • 前端:块级元素和行内元素
  • vue2+ element ui 集成pdfjs-dist
  • Jmeter基础篇(22)服务器性能监测工具Nmon的使用
  • 智能优化算法应用:基于白冠鸡算法无线传感器网络(WSN)覆盖优化 - 附代码
  • Redis key过期删除机制实现分析
  • Docker中安装Oracle10g和oracle增删改查
  • java 操作git
  • Excel 动态拼接表头实现导出
  • easyui实现省市县三级联动
  • 一张图理解接口测试框架
  • 汽车网络安全--ISO\SAE 21434解析(一)
  • 华为OD机试 - 机场航班调度程序(Java JS Python C)
  • 持续集成交付CICD:Jenkins使用GitLab共享库实现自动更新前后端项目质量配置
  • 【Qt】QLineEdit显示输入十六进制,位数不足时按照规则填充显示及每两个字符以空格填充
  • 零基础小白怎么准备蓝桥杯-蓝桥杯竞赛经验分享
  • 【使用uniapp完成微信小程序的图片下载到本机】
  • 安全众测-内网渗透常用的工具和命令
  • 基于Maven的Spring Boot应用版本号获取解析
  • 创建conan包-工具链
  • Auth的使用、缓存
  • 普中STM32 单片机资料
  • Vue+ElementUI技巧分享:结合Sortablejs实现表格行拖拽
  • 高防CDN技术的崛起与网络安全的演进