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>
相关推荐
小番茄夫斯基5 分钟前
全球大模型的价格和能力排行汇总
前端·后端·架构
Sirius Wu6 分钟前
Agent模型冷启动问题
开发语言·javascript·人工智能·机器学习·ecmascript·aigc
小小小小宇18 分钟前
前端领域 30 个值得安装的 Agent Skills
前端
xkxnq20 分钟前
第八阶段:工程化、质量管控与高级拓展(132天),Vue项目文档自动化:VuePress搭建组件文档(组件示例+API说明)
javascript·vue.js·自动化
喵了几个咪22 分钟前
基于 Next.js 的 Headless CMS 前端架构:技术解析与二次开发导引
前端·javascript·架构
星栈23 分钟前
Makepad 不只是画界面:事件、状态和组件通信,到底怎么写
前端·rust
dsyyyyy110125 分钟前
只用HTML和CSS实现换一换效果
前端·css·html
didadida26238 分钟前
Isshin AI TextFlow_开发文档_第一回(事件提取)
javascript·ai编程
青山Coding39 分钟前
Cesium应用(七):地形开挖的实现思路
前端·cesium
风骏时光牛马41 分钟前
Verilog常见问题及代码易错点梳理
前端