vue3實(shí)現(xiàn)alert自定義的plugins方式
vue3實(shí)現(xiàn)alert自定義的plugins

技術(shù)環(huán)境:
vue3實(shí)現(xiàn)一個(gè)alert的plugins
代碼目錄如下:

1. plugins/Message/index.vue
<template>
<div class="default-message">
<div class="default-message-content">
<div class="default-message-title">{{title}}</div>
<div class="default-message-value" v-html="content"></div>
<div class="default-message-btns">
<div class="default-message-cancle default-message-btn"
v-if="cancleText" :style="setCancleColor()"
@click.prevent.stop="handleCancel">
{{cancleText}}
</div>
<div class="default-message-submit default-message-btn"
:style="setOkColor()" @click.prevent.stop="handleOk">
{{okText}}
</div>
</div>
</div>
</div>
</template>
<script>
import { defineComponent } from "vue";
export default defineComponent({
name: "Message",
props: {
// 標(biāo)題
title: {
type: String,
default: "提示",
},
// 內(nèi)容
content: {
type: String,
default: "",
required: true,
},
// 確定按鈕文字
okText: {
type: String,
default: "確定",
},
// 確定按鈕文字顏色
okTextColor: {
type: String,
default: "#26a2ff",
},
// 取消按鈕文字
cancleText: {
type: String,
default: "",
},
// 取消按鈕文字顏色
cancleTextColor: {
type: String,
default: "#999",
},
// 成功回調(diào)
success: {
type: Function,
},
// 失敗回調(diào)
fail: {
type: Function,
},
},
setup(props) {
// ok的顏色
const setOkColor = () => {
return `color: ${props.okTextColor}`;
};
// 取消的顏色
const setCancleColor = () => {
return `color: ${props.cancleTextColor}`;
};
// 移除當(dāng)前組件
function removeModal() {
const modelDom = document.body.querySelector(
`.__default__container__message__`
);
if (modelDom) {
document.body.removeChild(modelDom);
}
}
const handleCancel = () => {
removeModal();
props.fail && props.fail();
};
const handleOk = () => {
removeModal();
props.success && props.success();
};
return {
setOkColor,
setCancleColor,
handleOk,
handleCancel,
};
},
});
</script>
<style scoped lang="scss">
.default-message {
position: fixed;
right: 0;
top: 0;
bottom: 0;
left: 0;
z-index: 1000;
background: rgba($color: #000000, $alpha: 0.3);
.default-message-title {
padding-top: 15px;
text-align: center;
font-size: 18px;
font-weight: 700;
color: #333;
}
.default-message-content {
width: 85%;
position: absolute;
top: 50%;
left: 50%;
transform: translate3d(-50%, -50%, 0);
background-color: #fff;
border-radius: 6px;
transition: all 0.2s ease-in;
color: #999;
font-size: 18px;
}
.default-message-value {
padding: 10px 20px 15px;
min-height: 36px;
position: relative;
color: #999;
text-align: center;
line-height: 36px;
}
.default-message-btns {
// border-top: 1px solid #ddd;
display: flex;
height: 46px;
position: relative;
&:after {
position: absolute;
content: "";
display: inline-block;
left: 0;
right: 0;
top: 0;
height: 1px;
transform: scaleY(0.5);
background: #ddd;
}
.default-message-btn {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
padding: 0 3px;
}
.default-message-cancle {
position: relative;
&:after {
position: absolute;
content: "";
display: inline-block;
top: 0;
right: 0;
bottom: 0;
width: 1px;
transform: scaleX(0.5);
background: #ddd;
}
}
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
}
</style>
2. plugins/Message/index.js
import { createVNode, render } from "vue";
import MessageConstructor from "./index.vue";
const $message = function(options) {
// 創(chuàng)建div
const container = document.createElement("div");
container.className = `__default__container__message__`;
//創(chuàng)建虛擬節(jié)點(diǎn)
const vm = createVNode(MessageConstructor, options);
//渲染虛擬節(jié)點(diǎn)
render(vm, container);
document.body.appendChild(container);
};
export default {
//組件注冊(cè)
install(app) {
app.config.globalProperties.$message = $message;
}
};3. main.js
import { createApp } from "vue";
import router from "./router";
import store from "./store";
import App from "./App.vue";
import Message from "./assets/plugins/Message";
const app = createApp(App);
app.use(Message);
app.use(store);
app.use(router);
app.mount("#app", { username: "123 });4. 使用方法
import { getCurrentInstance } from "vue";
setup(props) {
const { ctx } = getCurrentInstance();
ctx.$message({
content: "您確定要退出嗎?",
cancleText: "取消",
success: (res) => {
console.log(res);
},
fail: (err) => {
console.log(err);
},
});
}5. 升級(jí)改造
由于當(dāng)前 ctx.$message 僅僅只在setup里面使用, 如果希望在unit.js或者其他js文件中使用? 下面開(kāi)始我的表演
- 5.1 js文件中需要使用vue的app實(shí)例對(duì)象
// main.js export const app = createApp(App);
- 5.2 js文件引入app實(shí)例
// util.js
import { app } from "../../main";
/**
* @params title String
* @params content String
* @params okText String
* @params okTextColor String
* @params cancleText String
* @params cancleTextColor String
* @return promise
*/
export function showMessage(params) {
return new Promise((resolve, reject) => {
app.config.globalProperties.$message({
...params,
success: () => {
return resolve("is:ok");
},
fail: () => {
return reject("is:cancle");
}
});
});
}- 5.3 使用方法
import { showMessage } from "../../assets/scripts/util";
setup(){
const logout = () => {
showMessage({ content: "您確定要退出嗎?", cancleText: "取消" })
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});
};
return { logout };
}文檔說(shuō)明:
| 字段 | 說(shuō)明 | required | type | 默認(rèn) |
|---|---|---|---|---|
| title | 標(biāo)題 | false | string | 提示 |
| content | 內(nèi)容 | true | string | |
| okText | 確定按鈕文字 | false | string | 確定 |
| okTextColor | 確定按鈕文字顏色 | false | string | #26a2ff |
| cancleText | 取消按鈕文字 | false | string | |
| cancleTextColor | 取消按鈕文字顏色 | false | string | #999 |
| success | 成功回調(diào) | false | Function | |
| fail | 失敗回調(diào) | false | Function |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何用vue實(shí)現(xiàn)網(wǎng)頁(yè)截圖你知道嗎
這篇文章主要為大家介紹了vue如何實(shí)現(xiàn)網(wǎng)頁(yè)截圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-11-11
Vue基于el-breadcrumb實(shí)現(xiàn)面包屑功能(操作代碼)
這篇文章主要介紹了Vue基于el-breadcrumb實(shí)現(xiàn)面包屑功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
關(guān)于vue中watch檢測(cè)到不到對(duì)象屬性的變化的解決方法
本篇文章主要介紹了關(guān)于vue中watch檢測(cè)到不到對(duì)象屬性的變化的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
解決Vue路由導(dǎo)航報(bào)錯(cuò):NavigationDuplicated:?Avoided?redundant?navig
這篇文章主要給大家介紹了關(guān)于解決Vue路由導(dǎo)航報(bào)錯(cuò):NavigationDuplicated:?Avoided?redundant?navigation?to?current?location的相關(guān)資料,這是最近做項(xiàng)目時(shí)候遇到的一個(gè)問(wèn)題,現(xiàn)將解決辦法分享出來(lái),需要的朋友可以參考下2023-01-01
Vue iview-admin框架二級(jí)菜單改為三級(jí)菜單的方法
這篇文章主要介紹了Vue iview-admin框架二級(jí)菜單改為三級(jí)菜單的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
vue-cli項(xiàng)目配置多環(huán)境的詳細(xì)操作過(guò)程
vue-cli 默認(rèn)只提供了 dev 和 prod 兩種環(huán)境。這篇文章主要介紹了vue-cli項(xiàng)目配置多環(huán)境的詳細(xì)操作過(guò)程,需要的朋友可以參考下2018-10-10
通過(guò)html文件來(lái)使用Vue的單文件組件形式詳解
這篇文章主要介紹了通過(guò)html文件來(lái)使用Vue的單文件組件形式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

