vue3实现alert自定义的plugins

技术环境:
vue3实现一个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: {
// 标题
title: {
type: string,
default: "提示",
},
// 内容
content: {
type: string,
default: "",
required: true,
},
// 确定按钮文字
oktext: {
type: string,
default: "确定",
},
// 确定按钮文字颜色
oktextcolor: {
type: string,
default: "#26a2ff",
},
// 取消按钮文字
cancletext: {
type: string,
default: "",
},
// 取消按钮文字颜色
cancletextcolor: {
type: string,
default: "#999",
},
// 成功回调
success: {
type: function,
},
// 失败回调
fail: {
type: function,
},
},
setup(props) {
// ok的颜色
const setokcolor = () => {
return `color: ${props.oktextcolor}`;
};
// 取消的颜色
const setcanclecolor = () => {
return `color: ${props.cancletextcolor}`;
};
// 移除当前组件
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) {
// 创建div
const container = document.createelement("div");
container.classname = `__default__container__message__`;
//创建虚拟节点
const vm = createvnode(messageconstructor, options);
//渲染虚拟节点
render(vm, container);
document.body.appendchild(container);
};
export default {
//组件注册
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. 升级改造
由于当前 ctx.$message 仅仅只在setup里面使用, 如果希望在unit.js或者其他js文件中使用? 下面开始我的表演
- 5.1 js文件中需要使用vue的app实例对象
// main.js export const app = createapp(app);
- 5.2 js文件引入app实例
// 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 };
}文档说明:
| 字段 | 说明 | required | type | 默认 |
|---|---|---|---|---|
| title | 标题 | false | string | 提示 |
| content | 内容 | true | string | |
| oktext | 确定按钮文字 | false | string | 确定 |
| oktextcolor | 确定按钮文字颜色 | false | string | #26a2ff |
| cancletext | 取消按钮文字 | false | string | |
| cancletextcolor | 取消按钮文字颜色 | false | string | #999 |
| success | 成功回调 | false | function | |
| fail | 失败回调 | false | function |
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论