Vue3+TypeScript学习笔记(二十八)

简介: 本节记录自定义Vue插件相关的内容

每一个Vue插件中都有一个install方法,当使用Vue.use(插件名)时Vue将调用插件中的install方法执行对应功能,下面是一个展示Loading状态的Vue插件

  1. Loading文件夹

    Loading.vue

<template>
<!--   定义初始状态false -->
    <div v-if="show" class="default">
        <div class="loading">Loading……</div>
    </div>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue'

let show = ref<boolean>(false)
const hide = () => show.value = false

const emerge = () => show.value = true

// 暴露函数,在vNode中可以通过component.exposed.方法名()来调用
defineExpose({
    hide,
    emerge,
})
</script>

<style scoped>
.default {
    background-color: #ccc;
    display: flex;
    width: 100%;
    height: 100%;
    justify-content: center;
    align-items: center;
    font-size: 50px;
}
.loading {
    display: flex;
    justify-content: center;
    align-items: center;
    width: 300px;
    height: 300px;
    background-color: #928f8f;
}
</style>

index.ts

import type { App, VNode } from 'vue'
// 引入创建函数和render渲染函数
import { createVNode, render } from 'vue'
// 引入组件,但此时组件还不是虚拟DOM,不能直接使用
import LoadingVue from './Loading.vue'

export default {
    install(app: App) {
    // 创建vNode(虚拟DOM)
        const vNode: VNode = createVNode(LoadingVue)
    // 将vNode挂载到页面上,此时v-if是false状态
        render(vNode, document.body)
    // 定义全局变量以便在其他组件中使用
        app.config.globalProperties._loading = {
            emerge(){
                vNode.component?.exposed?.emerge()
            },
            hide(){
                vNode.component?.exposed?.hide()
            }
        }
    },
}

src文件夹:
App.vue

<template>
  <button @click="show(true)">显示</button>
  <button @click="show(false)">隐藏</button>
</template>

<script setup lang="ts">
  import { ref, reactive, getCurrentInstance } from 'vue'

  let instance = getCurrentInstance()
  const show = (option: boolean) => {
    if (option == true) {
      // 调用全局方法以展示/隐藏组件
      instance?.proxy?._loading.emerge()
    } else {
      instance?.proxy?._loading.hide()
    }
  }
</script>

<style></style>

main.ts

import { createApp } from 'vue'
// import './style.css'
import App from './App.vue'
import Loading from './components/Loading'
export const app = createApp(App)

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

// 以下为声明文件部分
type Lod =  {
    emerge: () => void
    hide : () => void
}
declare module '@vue/runtime-core'{
    export interface ComponentCustomProperties{
        _loading:Lod
    }
}

app.use源码实现:
MyUse

// 手动实现app.use,实际上就是调用install方法并传入app参数
import type { App } from 'vue'
import { app } from './main'

interface plugins {
  install: (app: App) => void
}

// 添加缓存策略防止插件被重复注册
const installList = new Set()

// 添加限制,plugin必须实现install方法
export const MyUse = <T extends plugins>(plugin: T) => {
  if(installList.has(plugin)){
    console.log('此插件已被注册');
  }else{
    plugin.install(app)
    installList.add(plugin)
  }
}

接下来在main.ts中引入MyUse,然后使用MyUse(插件名)进行注册即可

相关文章
|
14天前
|
JavaScript 前端开发
TypeScript 学习笔记(六):TypeScript 与前端框架的结合应用
笔记,进一步提升 TypeScript 编程技能。
20 1
|
22天前
|
JavaScript 前端开发 编译器
TypeScript 学习笔记
TypeScript 学习笔记
|
22天前
|
JavaScript 前端开发 数据可视化
前端开发使用 Vue 3 + TypeScript + Pinia + Element Plus + ECharts
前端开发使用 Vue 3 + TypeScript + Pinia + Element Plus + ECharts
55 0
|
22天前
|
JavaScript 前端开发
在Vue中使用TypeScript的常见问题有哪些?
在Vue中使用TypeScript的常见问题有哪些?
40 2
|
22天前
|
JavaScript 前端开发
在Vue中使用TypeScript的优缺点是什么?
在Vue中使用TypeScript的优缺点是什么?
25 0
|
22天前
|
JavaScript
在 Vue 中如何使用 TypeScript?
在 Vue 中如何使用 TypeScript?
17 0
|
22天前
|
JavaScript 安全 容器
Vue3 + setup + TypeScript: 构建现代、类型安全的Vue应用的关键技巧总结
当使用 setup 的时候,组件直接引入就可以了,不需要再自己手动注册
|
22天前
|
JavaScript Go 数据库
用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。
Vue3 的父子组件传值、绑定表单数据、UI库的二次封装、防抖等,想来大家都很熟悉了,本篇介绍一种使用 Typescript 的方式进行统一的封装的方法。
|
22天前
|
前端开发 JavaScript 测试技术
Vue3+Vite+TypeScript常用项目模块详解(下)
现在无论gitee还是github,越来越多的前端开源项目采用Vue3+Vite+TypeScript+Pinia+Elementplus+axios+Sass(css预编译语言等),其中还有各种项目配置比如eslint 校验代码工具配置等等,而我们想要进行前端项目的二次开发,就必须了解会使用这些东西,所以作者写了这篇文章进行简单的介绍。
|
1天前
|
JavaScript 前端开发 Java
TypeScript 类型兼容性
TypeScript 类型兼容性