使用强大的Vuetify开发前端页面,结果发现官方没有提供简便的全局消息通知组件(像Element中的ElMessage那样
),所以自己动手写了一个简单的组件,效果如下:
PS:如果是我没找到官方版本,请评论告诉我!下面直接上代码
该文件可视为util
文件,但我将其放在了stores
文件夹下,主要提供了两个作用:
newAlert
全局变量,用于临时存储新Alert信息。alert
,如:successAlert
、errorAlert
等。typescriptimport { ref } from 'vue'
export interface AlertInfo {
id: string,
type: string,
message: string
}
export const newAlert = ref<AlertInfo>({
id: 'alert' + 0,
type: '',
message: ''
})
export const alert = (type: string, message: string) => {
newAlert.value.id = Math.random().toString()
newAlert.value.type = type
newAlert.value.message = message
}
export const errorAlert = (message: string) => {
alert('error', message)
}
export const successAlert = (message: string) => {
alert('success', message)
}
export const infoAlert = (message: string) => {
alert('info', message)
}
export const warningAlert = (message: string) => {
alert('warning', message)
}
该文件是v-alert
二次封装的组件,主要提供了以下几个功能:
newAlert
值的变化,当值变化时,根据当时newAlert
更新alertMap
;alertMap
创建多个v-alert
;v-alert
;v-alert
的显示位置。html<script setup lang="ts">
import { ref, watch } from 'vue'
import { type AlertInfo, newAlert } from '@/stores/alert'
// 定义 Map,存储Alert信息集合,使用Map便于删除
const alertMap = ref<Map<string, AlertInfo>>(new Map)
// 监听新Alert创建
watch(newAlert.value, () => {
alertMap.value.set(newAlert.value.id, { ...newAlert.value })
console.log(alertMap.value)
deleteAlert(newAlert.value.id)
})
const deleteAlert = (id: string) => {
console.log(id)
setTimeout(() => {
alertMap.value.delete(id)
}, 3000)
}
</script>
<template>
<div class="alert-container">
<v-alert
class="v-alert"
v-for="(alert, index) in Array.from(alertMap.values())"
:key="index"
:type="alert.type"
border="start"
variant="tonal"
closable
close-label="Close Alert"
:text="alert.message"
>
</v-alert>
</div>
</template>
<style scoped>
.alert-container {
position: absolute;
top: 8%;
right: 5%;
}
.v-alert {
margin-top: 0.2rem !important;
}
</style>
有了以上两个文件后,即可调用测试
App.vue
中引用,如下:html<script setup lang="ts">
import { RouterView } from 'vue-router'
// 引用GlobalAlert
import GlobalAlert from '@/components/GlobalAlert.vue'
</script>
<template>
<!-- 引用GlobalAlert -->
<GlobalAlert />
<RouterView />
</template>
<style scoped>
</style>
html<script setup lang="ts">
// 引入封装好的工具方法
import { successAlert, errorAlert, infoAlert, warningAlert } from '@/stores/alert'
</script>
<template>
<!-- 按钮直接调用测试 -->
<v-btn variant="tonal"
@click="successAlert('success')">
success
</v-btn>
<v-btn variant="tonal"
@click="errorAlert('error')">
error
</v-btn>
<v-btn variant="tonal"
@click="infoAlert('info')">
info
</v-btn>
<v-btn variant="tonal"
@click="warningAlert('warning')">
warning
</v-btn>
</template>
<style scoped>
</style>
建站不易,以下是一个广告,还请动动您的小拇指,点击一次以示鼓励,谢谢!
就目前的访问量,即便每个访客都点一次广告,收入也不足以支付运营成本,
如果看不到广告,可能是网络原因或被拦截了,那就算了吧。祝你生活愉快~~
本文作者:DingDangDog
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!