Vue3 + TS + Element-Plus 封装的 Dialog 弹窗组件

弹窗组件中自定义了表头增加了全屏,svg-icon 没有的话可能会报错,换成自己的图标就可以

<template><el-dialog:dialogHeight="dialogHeight":title="dialogTitle"class="dialog min-w-70"v-model="dialogVisible"append-to-body:modal="dialogModal":fullscreen="fullscreen":close-on-click-modal="dialogClickModalClose":draggable="dialogDraggable":show-close="false":width="dialogWidth":align-center="dialogAlignCenter":center="dialogContentCenter"@open="open"@close="close"><template #header><div class="flex justify-between items-content"><div class="titleClass">{{ dialogTitle }}</div><div class="icon-content"><!-- <el-icon class="single-uploader__icon text-[12px]"><i-ep-minus v-if="fullscreen" /><i-ep-plus v-else /></el-icon>--><div :title="!fullscreen ? '全屏' : '还原'"><svg-iconclass="icon-item-content"v-if="showExpand"@click="zoom":icon-class="fullscreen ? 'fullscreen-exit' : 'fullscreen'"/></div><div title="关闭"><el-iconv-if="showClose"@click="close"title="关闭"class="single-uploader__icon icon-item-content"><i-ep-close /></el-icon></div></div></div></template><div :style="{ height: dialogBodyHeight }" class="overflow-a0uto"><slot></slot></div><template #footer v-if="dialogFooterBtn"><el-button type="primary" @click="SaveSubmit">确 定</el-button><el-button @click="CloseSubmit">取 消</el-button></template></el-dialog>
</template>
<script setup lang="ts">
// 【接口】接受传参字段
interface IProps {// 是否显示 Dialogvisible: boolean;// 对话框的标题dialogTitle?: string;// 内容区域高度dialogHeight?: string;// 对话框的宽度dialogWidth?: string;// 是否需要遮罩层dialogModal?: boolean;// 是否水平垂直对齐对话框dialogAlignCenter?: boolean;// 是否让 Dialog 的 header 和 footer 部分居中排列dialogContentCenter?: boolean;// 是否可以通过点击 modal 关闭 DialogdialogClickModalClose?: boolean;// 为 Dialog 启用可拖拽功能dialogDraggable?: boolean;// 是否显示底部按钮dialogFooterBtn?: boolean;// 是否显示全屏按钮showExpand?: boolean;// 是否显示关闭按钮showClose?: boolean;
}// 初始化默认参数
const props = withDefaults(defineProps<IProps>(), {dialogTitle: "默认标题",dialogWidth: "40%",dialogHeight: "auto",dialogModal: true,dialogAlignCenter: false,dialogContentCenter: false,dialogClickModalClose: false,dialogDraggable: false,dialogFooterBtn: true,showExpand: false,showClose: true,
});const emit = defineEmits(["save","cancellation","open","close","zoom","update:visible",
]);const dialogVisible = useVModel(props, "visible", emit);
let fullscreen = ref(false);
const dialogBodyHeight = ref<string | number>(); // 初始值为字符串类型// watch监听
watch([() => props.visible, () => props.dialogHeight, () => props.dialogFooterBtn],() => {nextTick(() => {menuDialogZoom();});},{ deep: true, immediate: true }
);// 保存提交回调函数
const SaveSubmit = () => {emit("save"); //emit方法供父级组件调用
};// 取消保存回调函数
const CloseSubmit = () => {emit("cancellation"); //emit方法供父级组件调用
};// 打开事件回调函数
const open = () => {emit("open"); //emit方法供父级组件调用
};// 关闭事件回调函数(当显示头部关闭按钮时需调用该回调函数方法 -> dialogShowClose = true 反之)
const close = () => {emit("close"); //emit方法供父级组件调用
};// 缩放弹窗
const zoom = () => {fullscreen.value = !fullscreen.value;menuDialogZoom();console.log(fullscreen.value);emit("zoom", fullscreen.value); //emit方法供父级组件调用
};/* 分配权限缩放弹窗 */
const menuDialogZoom = () => {if (props.visible && fullscreen.value && props.dialogFooterBtn) {dialogBodyHeight.value = "calc(100vh - 120px)";} else if (props.visible && fullscreen.value && !props.dialogFooterBtn) {dialogBodyHeight.value = "calc(100vh - 80px)";} else {dialogBodyHeight.value = props.dialogHeight;}
};
</script>
<style scoped>
.titleClass {font-weight: bold;
}.icon-content {display: flex;align-items: center;
}.icon-item-content {display: flex;align-items: center;justify-content: center;color: #909399;
}.icon-item-content:nth-child(1) {margin-right: 10px;
}.icon-item-content:hover {color: #1f6feb;cursor: pointer;
}.single-uploader__icon {font-size: 18px;
}
</style>

使用案例

    <DialogdialogHeight="350px"v-model:visible="menuDialogVisible":dialogTitle="'【' + checkedRole.name + '】权限分配'":dialogDraggable="true"dialogWidth="30%"@close="menuDialogVisible = false"@save="handleRoleMenuSubmit"@cancellation="menuDialogVisible = false">内容区域</Dialog>

弹窗相关数据

let menuDialogVisible = ref(false);

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

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

相关文章

闪存存储和制造技术概述

闪存存储技术 引言 性能由高到低排序&#xff1a;SLC -> MLC -> TLC -> QLC 根据这个排序读写速度也越来越低&#xff0c;价格越来越便宜 1. SLC SLC&#xff08;Single-Level Cell&#xff0c;单层单元&#xff09;&#xff1a; SLC 闪存具有最高的性能、耐用性和可…

蓝网科技临床浏览系统 deleteStudy SQL注入漏洞复现(CVE-2024-4257)

0x01 产品简介 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统,主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。 0x02 漏洞概述 蓝网科技临床浏览系统 deleteStudy接口处SQL注入漏洞,未经身份验证的恶意攻击者利用 SQL 注入漏洞获取…

JAVA顺序表相关习题1

1.笔试题:cvte str1 :welcome to cvte str2:come 描述:删除第一个字符串当中出现的所有的第二个字符串的字符!结果:wlt vt 要求 用ArrayList完成! public class Test {public static List<Character> findSameWords(String u1, String u2){List<Character> listn…

gateway全局token过滤器

添加gateway依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>创建一个tokenFilter 实现全局过滤器GlobalFilter,并且实现fitler方法 Value("${…

工信部CAPPVD公布24年一季度积分情况,海云安位居全国第二!

近日&#xff0c;工业和信息化部移动互联网APP产品安全漏洞专业库&#xff08;以下简称“CAPPVD漏洞库”&#xff09;根据《CAPPVD漏洞库支撑单位能力评定办法》和综合24年第一季度的漏洞报送、重要行业企事业单位漏洞加分、高危漏洞处置加分、标准支撑等&#xff0c;最终公布了…

如何保证Redis双写一致性?

目录 数据不一致问题 数据库和缓存不一致解决方案 1. 先更新缓存&#xff0c;再更新数据 该方案数据不一致的原因 2. 先更新数据库&#xff0c;再更新缓存 3. 先删除缓存&#xff0c;再更新数据库 延时双删 4. 先更新数据库&#xff0c;再删除缓存 该方案数据不一致的…

值得推荐的文档透明加密软件TOP3

文档透明加密软件是一种可以对文档进行加密处理&#xff0c;同时保持文档的可读性和可编辑性的软件。通常&#xff0c;这种软件会在用户对文档进行保存或传输时自动对文档进行加密&#xff0c;而在用户需要访问文档时则会解密文档&#xff0c;以便用户正常地查看和编辑文档内容…

2024年【氧化工艺】最新解析及氧化工艺复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 氧化工艺最新解析是安全生产模拟考试一点通总题库中生成的一套氧化工艺复审模拟考试&#xff0c;安全生产模拟考试一点通上氧化工艺作业手机同步练习。2024年【氧化工艺】最新解析及氧化工艺复审模拟考试 1、【单选题…

第一章 引论

我是一个普普通通的学渣&#xff0c;2021年参加了PMP考试&#xff0c;获取了5A的成绩。 秘诀是多做题&#xff0c;题中不会的问题从书中找到答案。 下面整理了一下PMP知识体系&#xff0c;希望可以提供参考~ 1.1指南的概述和目的 •普遍认可 这些知识和做法在大多数时候适用…

Gone框架介绍3 - 使用gone命令,自动生成Priest函数

文章目录 1. 安装辅助工具: gone2. 创建一个名为gen-code的新项目3. 创建Goner4. 使用辅助工具5. 添加main函数 我在两年前实现了一个Golang的依赖注入框架&#xff0c;并且集成了gin、xorm、redis、cron、消息中间件等功能&#xff0c;自己觉得还挺好用的&#xff1b;之前一直…

Java8 Stream常见用法

Stream流的常见用法&#xff1a; 1.利用stream流特性把数组转list集合 //定义一个数组Integer[] array {5,2,1,6,4,3};//通过stream特性把数组转list集合List<Integer> list Arrays.stream(array).collect(Collectors.toList());//打印结果System.out.println(list);…

分布式与一致性协议之CAP和Paxos算法(一)

CAP 理论 如何使用BASE理论 以InfluxDB系统中DATA节点的集群实现为例。DATA节点的核心功能是读和写&#xff0c;所以基本可用是指读和写的基本可用。我们可以通过分片和多副本实现读和写的基本可用。也就是说&#xff0c;将同一业务的数据先分片&#xff0c;再以多份副本的形…

31.基础乐理-首调与固定调

首调与固定调的概念&#xff1a; 首调 与 固定调 这两个词都是针对 唱名 来说的&#xff0c;针对唱名1234567 来说的&#xff0c;和别的没什么关系&#xff0c;这两个概念是唱名的两种不同表达方式 首调&#xff1a;虽然各个大调实际使用的按键、使用的音名都是不一样的&#x…

OFDM802.11a的FPGA实现(五)卷积编码器的FPGA实现与验证(含verilog代码和matlab代码)

目录 1.前言2.卷积编码2.1卷积编码基本概念2.2 802.11a卷积编码器2.3 卷积编码模块设计2.4 Matlab设计与ModelSim仿真验证 1.前言 前面一节完成了扰码器的FPGA设计与Matlab验证&#xff0c;这节继续对卷积编码器进行实现和验证。 2.卷积编码 2.1卷积编码基本概念 卷积码编码器…

Zotero导入参考文献详细步骤

步骤一&#xff1a; 下载Zotero 步骤二&#xff1a;安装浏览器插件 下载安装Zotero Connector插件 步骤三&#xff1a;将需要的文献导入Zotero 1、在谷歌学术或者知网等搜索需要的文献 2、点击文章标题进入详情&#xff0c;在安装好Zotero插件后&#xff0c;同时保持Zotero打…

文件批量高效管理,批量将PDF类型文件移动到指定文件夹里,实现文件高效管理

文件的管理与整理成为了我们生活中不可或缺的一部分。面对堆积如山的PDF文件&#xff0c;你是否也曾感到手足无措、焦头烂额&#xff1f;现在&#xff0c;有了我们的批量文件管理工具&#xff0c;PDF文件的管理将变得前所未有的高效与简单&#xff01; 首先&#xff0c;我们要…

足球滚球数据分析靠谱吗?能不能通过大模型去实时预测?

足球滚球数据分析在一定程度上是靠谱的&#xff0c;但并非绝对可靠。滚球数据分析主要依赖于大量的历史数据、实时比赛数据以及相关的统计模型来预测比赛结果。这些数据可以包括球队的实力对比、球员状态、比赛进程、进球趋势、控球率变化等多个方面。 通过深入分析和挖掘这些数…

java 运行时数据区

java运行时数据区域 Java 运行时数据区域是 Java 虚拟机 (JVM) 在运行 Java 程序时所使用的内存空间的抽象表示。它主要包括以下几个区域&#xff1a; 程序计数器&#xff08;Program Counter Register&#xff09;&#xff1a; 程序计数器是一块较小的内存空间&#xff0c;是…

xLua背包实践

准备工作 环境&#xff0c;代码 在C#代码方面我们需要准备单例模式基类&#xff0c;AB包管理器&#xff0c;lua解析器管理器 详情请见AB包管理器 xlua详解 然后是Xlua包和AB包&#xff0c;具体导入方法也在上面的链接中 然后是lua的三个文件 具体代码&#xff1a; JsonUtil…

【算法每日一练】

蛮有意思的的一道题&#xff0c;最后要判断能否成为一种1~n的全排列&#xff0c;我最这样做的&#xff1a; 整个数组先排序一下。假设遍历到了i&#xff0c;那就判断前面b和r的个数&#xff0c;但是有想到了后面可能还会对前面的结果产生影响&#xff0c;所以就抛弃了这个想法…