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

Vue3封装全局插件

定义一个全局加载组件

一、首先定义dom元素

定义一个index.vue文件

<template>
    <div class="loading">
        loading...
    </div>
</template>
<script setup lang="ts">

</script>
<style scoped>
.loading {
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 30px;
    color: #fff;
    background: rgba(0, 0, 0, 0.8);
    height: 100vh;
}
</style>

第二步给dom元素添加,控制显示的开关和方法,然后通过defineExpose暴露出去

<script setup lang="ts">
import { ref } from "vue"
const isShow = ref<boolean>(false);
const show = () => {
    isShow.value = true
}
const hide = () => {
    isShow.value = false
}
defineExpose({
    isShow,
    show,
    hide
})
</script>
二、把组件渲染到全局

定义一个index.ts把组件暴露出去

createVNode创建虚拟节点,render把节点渲染到body,然后创建一个全局变量方便操作$Loading

import type { App, VNode } from "vue"
import { createVNode, render } 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,
        }
    }
}
三、注册组件
import { createApp } from 'vue'
import App from './App.vue'
import loading from './components/loading'

const app = createApp(App)

type Lod = {
    show():void,
    hide():void
}

declare module 'vue' {
    export interface ComponentCustomProperties {
        $Loading: Lod
    }
}

app.use(loading)
app.mount('#app')

使用

<template>
  <div class="">

  </div>
</template>
<script setup lang="ts">
import { getCurrentInstance } from 'vue';
const app = getCurrentInstance();
app?.proxy?.$Loading.show();
setTimeout(() => {
  app?.proxy?.$Loading.hide();
}, 2000)
</script>
<style scoped></style>


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

相关文章:

  • vue视频录制 限制大小,限制时长
  • 一种基于动态部分重构的FPGA自修复控制器
  • Druid连接Oracle数据库,连接失效导致SQL无法执行
  • LeetCode - 初级算法 数组(删除排序数组中的重复项)
  • Android使用DataBinding和Merge引发的血案
  • 深入理解 Vue 3 中的具名插槽
  • 给ORACLE创建一个用新用户并且给部分视图或表查询权限
  • ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作
  • 免费好用的第三方API汇总
  • AcWing 4. 多重背包问题 I 学习笔记
  • 2019ICPC南京站
  • 高防CDN如何预防攻击?
  • 单页应用(SPA)和多页应用(MPA)的区别和优缺点?
  • 1688阿里巴巴官方开放平台API接口获取商品详情、商品规格信息列表、价格、宝贝详情数据调用示例说明
  • JavaEE进阶(1)Java EE 简述(Java EE 发展历程、什么是Web开发? Web网站的工作流程、什么是框架?Java EE 框架学习概览)
  • 【flutter】使用getx下的GetMaterialApp创建路由和使用时间选择器国际化问题
  • 鸿蒙4.0真机调试踩坑
  • LeSS敏捷框架高效生产力实践
  • 短视频配音软件有哪些?这些常用的短视频配音软件
  • mongodb——原理简介,docker单机部署
  • Actor对象的引用 怎么设置他的材质?或设置是否启用重力?
  • Tomcat 基线安全加固操作
  • 简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板
  • java中@Async注解的作用?
  • C#有关里氏替换原则的经典问题答疑
  • MySQL 的执行原理(三)