Vue3+Ts封装类似el-dialog的对话框组件

news2024/11/26 12:49:57

 

提供11个字段对dialog组件进行控制:

  • modelValue: 对话框显示隐藏控制,

  • width: 控制对话框的宽度,

  • height:控制对话框的高度,

  • top: 控制对话框个距离顶部的距离,

  • title: 控制对话框的标题,

  • appendToBody: 是否将对话框添加至body,

  • closeOnClickModal: 是否点击遮罩层关闭抽屉,

  • showConfirm: 是否显示确认按钮,

  • showCancel: 是否显示取消按钮,

  • cancelText: 取消按钮的文本,

  • confirmText: 确认按钮的文本

dialog.vue代码如下

<template>
	<teleport v-if="appendToBody" to="body">
		<transition name="dialog-fade">
			<div v-show="visible" class="dialog-overlay" @click.self="handleCloseModal">
				<div class="dialog-content" :style="dialogStyle" @click.stop>
					<div class="dialog-header">
						<div class="title-content">
							<span>{{ title }}</span>
						</div>
					</div>
					<div class="mes-dialog-layout-main">
						<slot></slot>
					</div>
					<div class="dialog-btn">
						<div v-if="showCancel" class="dialog-button" @click="handleCancel">{{ cancelText }}</div>
						<div v-if="showConfirm" class="dialog-button" @click="handleSure">{{ confirmText }}</div>
					</div>
				</div>
			</div>
		</transition>
	</teleport>
	<transition name="dialog-fade" v-else>
		<div v-show="visible" class="dialog-overlay" @click.self="handleCloseModal">
			<div class="dialog-content" :style="dialogStyle" @click.stop>
				<div class="dialog-header">
					<div class="title-content">
						<span>{{ title }}</span>
					</div>
				</div>
				<div class="mes-dialog-layout-main">
					<slot></slot>
				</div>
				<div class="dialog-btn">
					<div v-if="showCancel" class="dialog-button" @click="handleCancel">{{ cancelText }}</div>
					<div v-if="showConfirm" class="dialog-button" @click="handleSure">{{ confirmText }}</div>
				</div>
			</div>
		</div>
	</transition>
</template>

<script lang="ts" setup>
import { ref, watch, computed } from "vue";
const props = withDefaults(
	defineProps<{
		modelValue?: boolean;
		width?: string;
		height?: string;
		top?: string;
		title?: string;
		appendToBody?: boolean;
		closeOnClickModal?: boolean;
		showConfirm?: boolean;
		showCancel?: boolean;
		cancelText?: string;
		confirmText?: string;
	}>(),
	{
		modelValue: false,
		width: "30%",
		height: "auto",
		top: "10%",
		title: "",
		appendToBody: true,
		closeOnClickModal: false,
		showConfirm: true,
		showCancel: true,
		cancelText: "取消",
		confirmText: "确认"
	}
);

const emit = defineEmits<{
	(event: "update:modelValue", value: boolean): void;
	(event: "beforeClose"): void;
	(event: "on-cancel"): void;
	(event: "on-sure"): void;
}>();

const visible = ref(props.modelValue);

watch(
	() => props.modelValue,
	newVal => {
		visible.value = newVal;
	}
);

const dialogStyle = computed(() => ({
	width: props.width,
	height: props.height,
	marginTop: props.top
}));

function handleCloseModal() {
	if (props.closeOnClickModal) {
		handleClose();
	}
}

function handleClose() {
	emit("beforeClose");
	emit("update:modelValue", false);
}

function handleCancel() {
	emit("on-cancel");
}

function handleSure() {
	emit("on-sure");
}
</script>

<style lang="scss" scoped>
.dialog-overlay {
	position: fixed;
	inset: 0;
	z-index: 9999;
	height: 100%;
	background-color: rgba(0, 0, 0, 0.7);
	overflow: auto;
	.dialog-content {
		position: relative;
		margin: 0 auto;
		background: #333333;
		border-radius: 2px;
		box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
		box-sizing: border-box;
		padding: 16px;
		overflow-wrap: break-word;
		.dialog-header {
			display: flex;
			align-items: center;
			justify-content: space-between;
			height: 56px;
			padding: 0 16px;
			border-bottom: 1px solid #efefef;
			color: #ffffff;
		}
		.mes-dialog-layout-main {
			padding: 16px;
			box-sizing: border-box;
			flex: 1;
			color: #ffffff;
		}
		.dialog-btn {
			display: flex;
			justify-content: flex-end;
			padding: 10px;
			.dialog-button {
				margin-left: 10px;
				display: inline-flex;
				justify-content: center;
				align-items: center;
				line-height: 1;
				height: 32px;
				white-space: nowrap;
				cursor: pointer;
				color: #fff;
				text-align: center;
				box-sizing: border-box;
				outline: 0;
				transition: 0.1s;
				font-weight: 500;
				-webkit-user-select: none;
				user-select: none;
				vertical-align: middle;
				-webkit-appearance: none;
				background-color: #2478f2;
				border: 1px solid #dcdfe6;
				border-color: #2478f2;
				padding: 8px 15px;
				font-size: 14px;
				border-radius: 4px;
			}
		}
	}
}
</style>

<style>
.dialog-fade-enter-active,
.dialog-fade-leave-active {
	transition: opacity 0.3s ease;
}

.dialog-fade-enter,
.dialog-fade-leave-to {
	opacity: 0;
}
</style>

 使用方式:

<template>
    <Dialog
		v-model="showDialog"
		width="500px"
		title="对话框"
		@before-close="dialogBeforeClose"
		@on-sure="handleDialogSure"
		@on-cancel="handleDialogCancel"
	>
		<p>This is the dialog content</p>
	</Dialog>
</template>

<script setup lang="ts">
import { ref } from "vue";
import Dialog from "@/components/Dialog/index.vue";
const showDialog= ref(false);
const handleShowDetails = () => {
	console.log("跳转到详情页");
	showDialog.value = true;
};
const dialogBeforeClose = () => {
	console.log("对话框关闭前");
	showDialog.value = false;
};
const handleDialogSure = () => {
	console.log("对话框确认");
	showDialog.value = false;
};
const handleDialogCancel = () => {
	console.log("对话框取消");
	showDialog.value = false;
};

</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GX Works2的使用方法

目录&#xff1a; 1、概述 2、硬件连接 3、录入与修改程序 1&#xff09;进入编辑按F2或点击“写入模式”图标 2&#xff09;修改部分元件 3&#xff09;注释 4&#xff09;改变显示触点数 4、软仿真与在线仿真 1&#xff09;软仿真 2&#xff09;在线仿真 5、P…

Linux源码阅读笔记-USB设备驱动架构

总线速度及主机控制器 USB系统架构 USB系统主机端提供为4个引脚的A型接口&#xff0c;USB外围设备通过4个引脚的B型接口和主机端连接。那4个引脚&#xff08;一条电压线VBUS、一条地线GND、一条正方向传输数据的D和一条反方向传输数据的D-线。&#xff09;USB主机和USB设备收发…

2024年翻译神器:探索四款好用的翻译工具!

因为有了一些翻译工具的存在&#xff0c;语言障碍已经渐渐不成问题。接下来就为大家推荐几款好用的翻译工具&#xff01; 福昕在线翻译 链接&#xff1a; https://fanyi.pdf365.cn/ 福昕在线翻译以其简洁的界面和强大的翻译能力&#xff0c;成为用户跨越语言障碍的首选。它…

独立站PrestaShop安装

独立站PrestaShop安装 独立站PrestaShop安装系统需求下载PrestaShop浏览器下载命令行下载 解压PrestaShop创建数据库移动PrestaShop源码到web目录composer安装依赖包nginx配置访问域名进入安装页面选择语言许可协议系统兼容性店铺信息Content of your store系统配置数据库店铺安…

金矢之lian,非你莫蜀:金矢留学携手16所英国大学共襄成都盛会

碧海蓝天的东海岸&#xff0c;盛夏的热烈未尽&#xff0c;草书云山如锦绣的天府之国&#xff0c;初秋的凉意渐起。近一年的忙碌与等待之后&#xff0c;2024年英国秋季入学申请已近尾声&#xff0c;如愿以偿拿到了录取的同学们&#xff0c;欢欣鼓舞的进入申请签证甚至预定行程机…

nginx实例

nginx的由来 Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的&#xff0c;开发工作最早从2002年开始&#xff0c;第一次公开发布时间是2004年10月4日&#xff0c;版本号是0.1.0。2019年3月11日F5 与 NGINX达成协议,F5 将收购 NGINX 的所…

NSSCTF联系记录:[SWPUCTF 2021 新生赛]crypto7

题目&#xff1a; 一共有32个字符&#xff0c;且只有数字和字母&#xff0c;可能为md5加密 得到答案

Linux shell编程学习笔记74:sed命令——沧海横流任我行(中)

0 前言 自 60 年代末以来&#xff0c;sed 一直是 Unix 标准工具箱的一部分。 Sed在以下三种情况下特别有用&#xff1a; 编辑太大的文件&#xff0c;无法进行舒适的交互式编辑&#xff1b; 当编辑命令序列过于复杂而无法在交互模式下轻松键入时&#xff0c;可以编辑任何大小的…

【学习笔记】Day 20

一、进度概述 1、机器学习常识12-18&#xff0c;以及相关代码复现 二、详情 12、SVM&#xff08;support vector machines&#xff0c;支持向量机&#xff09; 实际上&#xff0c;支持向量机是一种二分类模型&#xff0c;它将实例的特征向量映射为空间中的一些点&#xff0c;…

[C语言]-基础知识点梳理-文件管理

前言 各位师傅们好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解文件管理的相关知识&#xff0c;也就是常见的 读取&#xff0c;删除一类的操作 文件 为什么要使用文件&#xff1f; 程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&…

基于django的学生作业提交与管理系统,有管理后台,可作为课设使用

在本项目中&#xff0c;我们设计并实现了一个基于Django框架的学生作业提交与管理系统&#xff0c;旨在为教师和学生提供一个高效、便捷的作业管理平台。Django作为一个高效的Web框架&#xff0c;因其强大的功能和灵活的架构&#xff0c;使得本系统能够快速开发并扩展。 系统功…

KeyShot 2024.2:卓越的Mac与Windows 3D渲染与动画制作软件

KeyShot 2024.2作为一款专为Mac和Windows用户设计的3D渲染与动画制作软件&#xff0c;凭借其出色的性能和丰富的功能&#xff0c;在业界树立了新的标杆。这款软件不仅继承了KeyShot系列一贯的实时渲染和动画优势&#xff0c;还在多个方面进行了全面升级和优化&#xff0c;为3D设…

C++:二叉搜索树(binary search tree)

目录 1&#xff1a; 二叉搜索树概念 2&#xff1a;二叉搜索树操作 3&#xff1a;二叉树的模拟实现 4&#xff1a;二叉搜索树的应用 5&#xff1a;二叉搜索树的性能分析 6&#xff1a;复习前中后序遍历 7&#xff1a;二叉树进阶面试题 1&#xff1a; 二叉搜索树概念 二叉搜…

基于协同过滤算法的体育商品推荐系统_t81xg

TOC springboot618基于协同过滤算法的体育商品推荐系统_t81xg--论文 绪 论 近年来&#xff0c;随着互联网科技的进步和发展&#xff0c;人们的生活水平得到了极大的提高&#xff0c;图书的数量也在快速增加&#xff0c;以至于体育商品推荐的数量不断扩大&#xff0c;管理个性…

嵌入式学习——(Linux高级编程——线程)

线程 一、pthread 线程概述 pthread&#xff08;POSIX threads&#xff09;是一种用于在程序中实现多线程的编程接口。它与进程一样&#xff0c;可以用于实现并发执行任务&#xff0c;但与进程相比有一些不同的特点。 二、优点 1. 比多进程节省资源&#xff1a;进程在创建时…

如何用Java SpringBoot+Vue搭建太原学院商铺管理系统【实战教程】

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【中项第三版】系统集成项目管理工程师 | 第 12 章 执行过程组

前言 本章属于10大管理的内容&#xff0c;上午题预计会考8-10分&#xff0c;下午案例分析也会进行考查。学习要以教材为主。 目录 12.1 指导与管理项目工作 12.1.1 主要输入 12.1.2 主要输出 12.2 管理项目知识 12.2.1 主要输入 12.2.2 主要输出 12.3 管理质量 12.3.…

新160个crackme - 037-fireworx.2

运行分析 图标是火炬&#xff0c;估计是Delphi程序&#xff0c;需要破解Name和Serial PE分析 Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 - ida找到关键字符串&#xff0c;双击进入 ida动态调试&#xff0c;LStrCatN是一个拼接函数Serial v10 Name …

兴顺物流管理系统pf

TOC springboot539兴顺物流管理系统pf 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff…