十五分钟两百行代码,手写一个vue项目全局通用的弹框
前言:
我们在写vue项目时,弹框是非常常用的组件,并且在同一个项目中,弹框大多类似。所以我们可以抽离封装出一个通用的弹框;
因为vue3可向下兼容,所以作者这边会使用vue2的写法,vue3写法大同小异。
第一步:新建相关文件
一般来说是在src/components/dialog下新建如下两个文件:
- index.vue:该文件是组件内容相关的,用来书写弹框组件的结构、样式、和动态逻辑;
- index.js:该文件使用虚拟节点创建组件内容,并且注册组件。
第二步:书写组件内容
index.vue组件内容如下:
- 结构 + js 代码
<template>
<div class="default-message" :id="boxId">
<div class="default-message-content">
<div class="default-message-title">{{ title }}</div>
<div class="default-message-value" v-html="message"></div>
<div class="default-message-btns">
<div
class="default-message-cancle default-message-btn"
v-if="cancelBtnHtml"
@click.prevent.stop="handleCancel"
>
{{ cancelBtnHtml }}
</div>
<div
class="default-message-submit default-message-btn"
@click.prevent.stop="handleOk"
>
{{ okBtnHtml }}
</div>
</div>
</div>
</div>
</template>
<script>
import i18n from "@/i18n";
import { defineComponent } from "vue";
export default defineComponent({
name: "Dialog",
data() {
return {
i18nTitle: '',
i18nOkBtn: '',
};
},
props: {
boxId: {
type: String,
default: "",
},
// 标题
title: {
type: String,
default: "",
},
// 内容
message: {
type: String,
default: "",
},
// 确定按钮文字
okBtnHtml: {
type: String,
default: '',
},
// 取消按钮文字
cancelBtnHtml: {
type: String,
default: "",
},
// 成功回调
ok_function: {
type: Function,
},
// 失败回调
cancel_function: {
type: Function,
},
},
methods: {
handleCancel() {
this.removeModal();
this.cancel_function && this.cancel_function();
},
handleOk() {
this.removeModal();
this.ok_function && this.ok_function();
},
removeModal() {
const modelDom = document.getElementById(
"__default__container__content__"
);
if (modelDom) {
document.body.removeChild(modelDom);
}
},
},
created() {
this.i18nTitle = i18n.global.t('modal_warm_tip_title');
this.i18nOkBtn = i18n.global.t('activity_ok');
},
});
</script>
结构说明:
.default-message使我们整个弹框的容器,一般宽高都设置为100%,这个部分会有一个半透明的背景色(覆盖页面内容,防止弹框了还能操作页面);.default-message-content为整个弹框的内容区域,包括标题、提示信息、取消按钮、确定按钮;- 取消按钮和确定按钮支持执行传入的事件,方便我们在弹框弹出后点击按钮执行相应操作;
- 样式
<style lang="less" scoped>
.default-message {
position: fixed;
right: 0;
top: 0;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1000;
background: rgba(0, 0, 0, 0.7);
.default-message-title {
color: #333;
margin: 0;
line-height: 1.5;
font-size: 18px;
min-height: 18px;
padding-top: 20px;
text-overflow: ellipsis;
font-weight: bold;
cursor: move;
text-align: center;
}
.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: 28px 18px;
text-align: center;
position: relative;
color: #999;
text-align: center;
font-size: 14px;
color: rgba(102, 102, 102, 1);
}
.default-message-btns {
// border-top: 1px solid #ddd;
display: flex;
height: 60px;
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-submit {
color: #26a2ff;
}
.default-message-cancle {
color: #999;
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>
第三步:注册成全局组件
import {createVNode, render} from 'vue';
import MessageConstructor from './index.vue';
const $dialog = function (options) {
// 已存在一个弹窗则不重复渲染
if (!document.getElementById ('__default__container__content__')) {
// 创建div
const container = document.createElement ('div');
// container.className = `__default__container__message__`;
container.id = '__default__container__content__';
//创建虚拟节点
const vm = createVNode (MessageConstructor, options);
//渲染虚拟节点
render (vm, container);
document.body.appendChild (container);
}
};
export default {
//组件注册
install (app) {
app.config.globalProperties.$dialog = $dialog;
},
};
到这里,我们的弹框组件就完成了,接下来我们来使用看看。
项目中使用弹框
使用的方法也非常简单,所见即所得。
app.config.globalProperties.$dialog({
title: "弹框标题",
message: "弹框提示信息文案",
okBtnHtml: "确定",
cancelBtnHtml: "取消",
ok_function: () => {
console.log("点击弹框确定按钮处理函数");
},
cancel_function: () => {
console.log("点击弹框取消按钮处理函数");
}
});
说明:
- 标题、提示文案、以及取消和确定按钮文案,我们这边直接传入,
ok_function是确定按钮的回调,我们可以在这里做任何点击确定后想做的事,包括发送请求和异步操作,cancel_function同理。 - 弹框图片示例:
写在后面
这是一个比较基础的弹框组件,这边示例的代码是比较全的,对细节要求不大的小伙伴可以直接用;
背景颜色、字体、布局等这些细节,因为每个业务场景不同,大家可以根据自己的需要适当调整;
弹框是固定单位的,如果小伙伴的项目需要使用响应式大小,直接对应替换大小单位即可;
对你有帮助的话给作者点点关注吧,你的支持是我不断更新的动力!Peace and love~~
十五分钟两百行代码,手写一个vue项目全局通用的弹框的更多相关文章
- 【Xamarin挖墙脚系列:代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧(转)】
正愁如何选择构建项目中的视图呢,现在官方推荐画板 Storybord...但是好像 xib貌似更胜一筹.以前的老棒子总喜欢装吊,用代码写....用代码堆一个HTML页面不知道你们尝试过没有.等页面做出 ...
- 『练手』手写一个独立Json算法 JsonHelper
背景: > 一直使用 Newtonsoft.Json.dll 也算挺稳定的. > 但这个框架也挺闹心的: > 1.影响编译失败:https://www.cnblogs.com/zih ...
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
近期接触了几个刚入门的iOS学习者,他们之中存在一个普遍和困惑和疑问.就是应该怎样制作UI界面.iOS应用是非常重视用户体验的,能够说绝大多数的应用成功与否与交互设计以及UI是否美丽易用有着非常大的关 ...
- 看年薪50W的架构师如何手写一个SpringMVC框架
前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...
- 关于代码手写UI,xib和StoryBoard
代码手写UI 这种方法经常被学院派的极客或者依赖多人合作的大型项目大规模使用.Geek们喜欢用代码构建UI,是因为代码是键盘敲出来的,这样可以做到不开IB,手不离开键盘就完成工作,可以专注于编码环境, ...
- 几道JS代码手写面试题
几道JS代码手写面试题 (1) 高阶段函数实现AOP(面向切面编程) Function.prototype.before = function (beforefn) { let ...
- webview的简单介绍和手写一个H5套壳的webview
1.webview是什么?作用是什么?和浏览器有什么关系? Webview 是一个基于webkit引擎,可以解析DOM 元素,展示html页面的控件,它和浏览器展示页面的原理是相同的,所以可以把它当做 ...
- 手把手教你手写一个最简单的 Spring Boot Starter
欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- 【spring】-- 手写一个最简单的IOC框架
1.什么是springIOC IOC就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理. 如果我们手写一个最最简单的IOC,最终效果是怎样呢? xml配置: <b ...
随机推荐
- Linux greybus
背景 在研究高通平台驱动震动马达时,我需要为内核驱动实现以下功能:/sys/class/timed_output/vibrator/enable":sysfs文件系统注册接口.提供show. ...
- 【Mysql】Mysql字符集CHARACTER和COLLATE
一:设置服务器默认字符集为 utf8mb4 创建数据库时,如果没有指定字符集,会采用服务器的默认字符集.设置服务器默认字符集为 utf8mb4 可以提高便利性. 编辑 MySQL 的配置文件,修改服务 ...
- Sql Server 创建用户并限制权限
创建登录名 使用sa或者Windows身份验证登录,[安全性]-[登录名],右键[新建登录名] 设置登录名属性 设置数据库权限 db owner --拥有数据库全部权限,包括删除数据库权限 db ac ...
- Spring5.X的bean的scope作用域
scope属性 singleton:单例,默认值,调用getBean方法返回是同一个对象,实例会被缓存起来,效率比较高,当一个bean被标识为singleton时候,spring的IOC容器中只会存在 ...
- Solo 开发者周刊 (第5期):打破常规,探索技术新边界
这里会整合 Solo 社区每周推广内容.产品模块或活动投稿,每周五发布.在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解.本杂志开源,欢迎投稿. 产品推荐 1. ...
- C#委托的2种调用方式
第一种:直接调用,通过invoke方法: 第二种:这是第二种将委托作为方法的参数的间接调用: 下面举个栗子演示: using System; using System.Collections.Gene ...
- 解决方案 | 预装win11如何退回win10?
0.定义 本文所说的[退回]并不指的是win10升级后的变成win11再变为win10的退回.退回应该理解为[降级],或者叫作返回上一个版本.本文的适用范围局限于,预装系统是win11,想要不通过u盘 ...
- [WUSTCTF2020]朴实无华(命令执行)
请求头问题 去查了一下资料了解了一下没有什莫用 robots.txt 中有东西 假flag 但是请求头里有重要消息 访问页面/fl4g.php <img src="/img.jpg&q ...
- AI时代你应聚焦的领域在哪里
1. 每个人都应该拥抱AI 随着AI的飞速发展,把我们带到了一个全新的时代.在这个时代,AI将逐步渗透到各个方面,比如:自动驾驶.智能家居.医疗诊断.大模型等等.每个人都应该积极拥抱AI,让AI给我们 ...
- 2024NOI联合省选游记
人生当中成功只是一时的,而失败却是主旋律. 不太好的的阅读体验 本文作者:xxxalq 所谓游记,顾名思义就是指游玩所记,所以重点在玩而不在省选. 由于没有参加 \(\text{NOIP}\),导致我 ...