Vue自定義實(shí)現(xiàn)一個(gè)消息通知組件
一、效果描述
在JS中使用一個(gè)Message函數(shù),彈出一個(gè)自定義的消息框。
效果體驗(yàn):緩若江海凝清光
二、實(shí)現(xiàn)方式
1.新建一個(gè)消息組件
2.新建一個(gè)js文件,新建一個(gè)需要導(dǎo)出函數(shù)
3.在函數(shù)中新建一個(gè)Vue實(shí)例,并將消息組件掛載上去。
4.在需要使用到的地方導(dǎo)入
三、代碼展示
1.消息組件messageOne
<template>
<div
:class="yangshi == 0 ? 'message messageIn' : 'message messageOut'"
v-show="meShow"
:style="{
backgroundColor: tranColor,
color: getComplementColor(tranColor),
}"
@click="handleColse"
>
<div class="textBox">{{ message }}</div>
</div>
</template>
<script setup lang="ts">
import { computed, ref } from "vue";
const props = defineProps({
message: String,
color: String,
});
const message = computed(() => props.message);
const emits = defineEmits(["click"]);
// 傳輸?shù)念伾?
const tranColor = computed(() => props.color);
const meShow = ref(true);
const yangshi = ref(0);
const changeShow = () => {
setTimeout(() => {
yangshi.value = 1;
}, 2500);
setTimeout(() => {
meShow.value = false;
}, 3000);
};
// 判斷顏色格式
const isRgbColor = (color: string) => {
// RGB格式的正則表達(dá)式
const rgbRegex = /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/;
const rgbaRegex =
/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d{1}|0\.\d+)\)$/;
// 檢查RGB或RGBA格式
if (rgbRegex.test(color) || rgbaRegex.test(color)) {
return "rgb";
}
// 十六進(jìn)制格式的正則表達(dá)式
const hexRegex = /^#([0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/;
// 檢查十六進(jìn)制格式
if (hexRegex.test(color)) {
return "hex";
}
// 如果都不是,返回false
return false;
};
// hex轉(zhuǎn)rgb
const hexToRgb = (hex: string) => {
// 去除字符串前面的 '#'
hex = hex.replace("#", "");
// 如果顏色代碼只有三位(例如:#fff),則轉(zhuǎn)換為六位(例如:#ffffff)
if (hex.length === 3) {
hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
}
// 將十六進(jìn)制顏色拆分為RGB三個(gè)分量
const r = parseInt(hex.substring(0, 2), 16);
const g = parseInt(hex.substring(2, 4), 16);
const b = parseInt(hex.substring(4, 6), 16);
// 返回RGB對(duì)象或字符串,根據(jù)需要調(diào)整
// return {
// r: r,
// g: g,
// b: b
// };
// 如果需要返回字符串格式,可以使用以下代碼
return `rgb(${r}, ${g}, $)`;
};
// 獲取補(bǔ)色
const getComplementColor = (rgbString: string | undefined) => {
if (!rgbString) return;
let a = isRgbColor(rgbString);
if (a == "hex") {
rgbString = hexToRgb(rgbString);
}
// 正則表達(dá)式用于匹配rgb格式中的數(shù)值
const rgbRegex = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/;
const result = rgbString.match(rgbRegex);
// 如果沒(méi)有匹配到有效的rgb格式,則返回錯(cuò)誤
if (!result) {
throw new Error(
'Invalid RGB color format. Expected "rgb(R, G, B)" format.'
);
}
// 提取紅色、綠色和藍(lán)色的數(shù)值
const r = parseInt(result[1], 10);
const g = parseInt(result[2], 10);
const b = parseInt(result[3], 10);
// 計(jì)算補(bǔ)色的RGB值
const complementR = 255 - r;
const complementG = 255 - g;
const complementB = 255 - b;
// 格式化補(bǔ)色為"rgb(R, G, B)"字符串
const complementColor = `rgb(${complementR}, ${complementG}, ${complementB})`;
return complementColor;
};
const handleColse = () => {
emits("click");
};
changeShow();
</script>
<style scoped>
.message {
color: rgb(36, 21, 40);
min-width: 200px;
width: auto;
height: 70px;
background-color: rgba(17, 153, 20, 0.9);
position: absolute;
top: 50px;
left: 50vw;
transform: translateX(-50%);
display: flex;
justify-content: center;
align-items: center;
padding-left: 15px;
padding-right: 15px;
border-radius: 20px;
box-shadow: 2px 2px 2px 2px rgba(0, 0, 0, 0.2);
}
.messageIn {
animation: mShow 0.5s;
}
.messageOut {
animation: mNoShow 0.5s;
animation-fill-mode: forwards;
}
@keyframes mShow {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes mNoShow {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
</style>2.TS文件messageOne.ts
import { createApp } from "vue";
import MessageOne from "./messageOne.vue";
export function showMessageOne(message: string, onClick: any, color?: string) {
const div = document.createElement("div");
document.body.appendChild(div);
// 自定義掛載的組件和傳輸?shù)膮?shù)
const app = createApp(MessageOne, {
message,
color,
onClick() {
onClick(() => {
app.unmount();
div.remove();
});
},
});
app.mount(div);
}3.使用
<script setup lang="ts">
import { showMessageOne } from "../../components/messageOne";
const ClickButton = () => {
showMessageOne(
"消息通知",
(close: any) => {
close();
},
'#000'
);
};
</script>到此這篇關(guān)于Vue自定義實(shí)現(xiàn)一個(gè)消息通知組件的文章就介紹到這了,更多相關(guān)Vue消息通知組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue前端獲取/切換麥克風(fēng)、播放采集音頻和采集音量大小完整代碼
這篇文章主要給大家介紹了關(guān)于vue前端獲取/切換麥克風(fēng)、播放采集音頻和采集音量大小的相關(guān)資料,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12
vue 添加和編輯用同一個(gè)表單,el-form表單提交后清空表單數(shù)據(jù)操作
這篇文章主要介紹了vue 添加和編輯用同一個(gè)表單,el-form表單提交后清空表單數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
如何使用vue-json-viewer插件展示JSON格式數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于如何使用vue-json-viewer插件展示JSON格式數(shù)據(jù)的相關(guān)資料,Vue-json-viewer是一個(gè)Vue組件,用于在Vue應(yīng)用中顯示JSON數(shù)據(jù)的可視化工具,需要的朋友可以參考下2023-11-11
解決vue this.$forceUpdate() 處理頁(yè)面刷新問(wèn)題(v-for循環(huán)值刷新等)
這篇文章主要介紹了解決vue this.$forceUpdate() 處理頁(yè)面刷新問(wèn)題(v-for循環(huán)值刷新等),解決方法是使用this.$forceUpdate()強(qiáng)制刷新,文章給大家分享了代碼案例,需要的朋友參考下吧2018-07-07
Vue3使用html2canvas實(shí)現(xiàn)將指定div下載為圖片
這篇文章主要為大家詳細(xì)介紹了Vue3如何使用html2canvas實(shí)現(xiàn)將指定div下載為圖片,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-11-11
vue實(shí)現(xiàn)一個(gè)簡(jiǎn)單的分頁(yè)功能實(shí)例詳解
這篇文章主要介紹了vue實(shí)現(xiàn)一個(gè)簡(jiǎn)單的分頁(yè)功能,需要的朋友可以參考下2022-12-12
vue3+elementPlus二次封裝表單的實(shí)現(xiàn)代碼
最近使用Vue3+ElementPlus開(kāi)發(fā)項(xiàng)目,從整體上構(gòu)思組件的封裝。能寫(xiě)成組件的內(nèi)容都進(jìn)行封裝,方便多個(gè)地方使用,這篇文章給大家介紹了vue3+elementPlus二次封裝表單的實(shí)現(xiàn),并通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03

