插件编写及挂载
在使用createApp()初始化Vue应用程序后,可以通过调用use()方法将插件添加到你的应用程序中
如下实现一个Loading插件
Loading.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <!-- * @Description: * @Author: xiuji * @Date: 2022-11-29 15:54:13 * @LastEditTime: 2022-11-29 17:06:29 * @LastEditors: Do not edit --> <template> <div> <div class="loading" v-if="showLoading">加载中...</div> </div> </template>
<script setup lang="ts"> import { ref } from 'vue'; // 定义控制组件展示的开关 let showLoading = ref(false)
const show = () => { showLoading.value = true } const hide = () => { showLoading.value = false }
// 对外暴露当前组件的属性和方法 defineExpose({ showLoading, show, hide }) </script>
<style lang="scss" scoped> .loading { width: 100vw; height: 100vh; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: #999; text-align: center; line-height: 100vh; } </style>
|
Loading.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| /* * @Description: * @Author: xiuji * @Date: 2022-11-29 15:54:22 * @LastEditTime: 2022-11-29 17:08:42 * @LastEditors: Do not edit */ import { createVNode, render, VNode, App } from "vue"; import LoadingVue from "./index.vue";
export default { install(app: App) { // createVNode vue提供的底层方法 可以给我们组件创建一个虚拟DOM 也就是Vnode const Vnode: VNode = createVNode(LoadingVue) // render把Vnode挂载到指定节点 render(Vnode, document.body) // 全局挂载当前组件方法 app.config.globalProperties.$loading = { show: () => Vnode.component?.exposed?.show(), hide: () => Vnode.component?.exposed?.hide(), } } }
|
Main.ts
1 2 3 4 5 6
| type Lod = { show: () => void, hide: () => void }
app.use(LoadingVue)
|
使用插件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <!-- * @Description: * @Author: xiuji * @Date: 22022-11-20 09:14:30 * @LastEditTime: 2022-11-29 17:08:46 * @LastEditors: Do not edit --> <template> <div class="content"> </div> </template>
<script setup lang="ts"> // 使用loading组件 import { getCurrentInstance } from 'vue' // 通过getCurrentInstance()获取组件实例,调用其上挂载的插件方法 const loading = getCurrentInstance() loading?.proxy?.$loading.show() setTimeout(() => { loading?.proxy?.$loading.hide() }, 3000); </script>
<style lang="scss" scoped> .content { position: relative; flex: 1; height: 100%; margin: 20px; border: 1px solid #ccc; overflow: auto; } </style>
|