vue3 + TS 自定义插件-全局message提示插件示例

本文记录 Vue3 + ts 实现自定义一个全局插件,用于进行 message 消息提示,所谓全局插件即挂载到 vue 实例上,在 App 的任一子组件中均可通过 app 的实例调用该方法。消息提示功能只是示例主要是记录 Vue3 自定义插件功能的写法。

文件结构:

src/components/Toast/index.vue 文件用于搭建和渲染消息在页面上的显示效果,比如需要显示在页面的哪个位置、字体、颜色、显示和隐藏的动画效果等;

src/components/Toast/index.ts 文件用于实现将消息的显示/隐藏等方法全局挂载到 app 实例上(注:对象写法默认需要导出一个 install() 方法),这样在 main.ts 中导入并注册该组件即可;

主要代码

index.vue 文件

<!-- 封装消息提示插件 -->
<template>
  <Transition enter-active-class="animate__animated animate__bounceInRight"
    leave-active-class="animate__animated animate__bounceOutRight">
    <div v-if="isShow" class="message">{{ tipText }}</div>
  </Transition>
</template>

<script setup lang='ts'>
import { ref, reactive } from 'vue';
let isShow = ref<boolean>(false)
let tipText = ref<string | number>('默认提示内容')
const show = (str: string | number, time: number = 3000) => {
  tipText.value = str
  isShow.value = true
  // 2 秒后自动关闭
  setTimeout(() => {
    isShow.value = false
  }, time);
}
const hide = () => isShow.value = false
// 将组件内部的方法导出,方便外部访问
defineExpose({
  show,
  hide
})
</script>

<style lang='less' scoped>
.message {
  height: 40px;
  line-height: 40px;
  padding: 0 20px;
  border-radius: 5px;
  background-color: rgba(200, 217, 217, 0.5);
  position: fixed;
  top: 50px;
  right: 100px;
}
</style>

index.ts 文件

import { App, createVNode, VNode, render } from 'vue'
import Toast from './index.vue'

export default {
  install(app: App) {
    // 将组件转换为虚拟DOM
    const Vnode: VNode = createVNode(Toast)
    // 将虚拟DOM挂载到页面节点上
    render(Vnode, document.body)
    // 将插件的主要方法挂载到 app.config.globalProperties 上,这里的 $toast 是自定义的
    app.config.globalProperties.$toast = {
      // 这里仅挂载了一个 show 方法到 $toast 上
      show(str: string | number, time?: number) {
        Vnode.component?.exposed?.show(str, time)
      },
    }
  },
}

然后在 main.ts 中导入并注册该插件

// 注册插件
import Toast from './components/Toast'
const app = createApp(App)

// 只要是插件都需要进行注册,都是通过 app.use() 进行注册的
app.use(Toast)

使用插件

进行到此我们的自定义插件就已经可以在任意 App 的子组件中使用了,如:

import { getCurrentInstance } from 'vue'
const instance = getCurrentInstance()
// 使用自定义的全局消息提示插件
instance?.proxy?.$toast.show('this is default message')

效果图

 

扩充声明文件 

注:以上虽然全局的消息插件是能使用了,但是因为 $toast 缺乏类型声明文件所以会报错而且其内部的方法、变量等成员均没有智能提示,所以我们还需要在 main.ts 文件中对 $toast 的成员类型进行声明main.ts 文件中关于注册该自定义插件的代码进行如下更新

// 注册插件
import Toast from './components/Toast'
const app = createApp(App)

type Toast = {
  show: <T>(str: string | number, time?: number) => void
}
// 编写自定义插件的声明文件,防止报错,声明后也会有智能提示
declare module '@vue/runtime-core' {
  export interface ComponentCustomProperties {
    $toast: Toast
  }
}

// 只要是插件都需要进行注册,都是通过 app.use() 进行注册的
app.use(Toast)

注:更新后如果页面中还是报错(爆红色提醒),重启服务即可,且在页面上访问 $toast 的内部成员也会有智能提示,比如 show() 方法,且该方法需要几个参数、参数需要什么类型都会有提示。至此我们 Vue3 + ts 的自定义插件就封装完成啦!

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Vue 3和TypeScriptTS)结合使用Element Plus来进行角色菜单分配,是一种很好的选择。下面是一个关于如何实现角色菜单分配的简单示例。 首先,我们需要安装Vue 3、TypeScript和Element Plus。可以使用npm命令进行安装。 ```bash npm install vue@next npm install typescript npm install element-plus ``` 然后,在Vue 3项目的入口文件中,可以引入Element Plus的模块,以及一些额外的样式文件。 ```javascript import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' import App from './App.vue' const app = createApp(App) app.use(ElementPlus) app.mount('#app') ``` 在组件中,我们可以使用Element Plus的Menu组件来展示菜单,并通过V-if指令来根据角色进行菜单项的展示与隐藏。 ```vue <template> <div> <el-menu> <el-menu-item v-if="hasAccess('dashboard')">仪表盘</el-menu-item> <el-menu-item v-if="hasAccess('users')">用户管理</el-menu-item> <el-menu-item v-if="hasAccess('roles')">角色管理</el-menu-item> </el-menu> </div> </template> <script> import { defineComponent } from 'vue' export default defineComponent({ data() { return { userRoles: ['dashboard', 'users', 'roles'] } }, methods: { hasAccess(role) { return this.userRoles.includes(role) } } }) </script> <style> /* 根据需要自定义样式 */ </style> ``` 在该示例中,假设用户角色以数组的形式存储在`userRoles`属性中。通过定义一个`hasAccess`方法,我们可以判断用户是否拥有某个角色,然后根据判断结果,在菜单项上使用V-if指令来展示或隐藏对应的菜单项。 当用户拥有某个角色时,该菜单项将会在界面上显示出来,反之,则不会显示。需要注意的是,需根据实际需求对示例中的角色判断逻辑进行调整。 这只是一个简单的示例,实际的角色菜单分配功能可能涉及到更复杂的逻辑和接口调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值