vue3封装ElementUI plus Dialog弹窗

因为ElementuiPlus的dialog弹框的初始样式不太好看,而公司要求又要好看,本来是已经实现了,但是后来想想了发现封装完dialog的其他功能也要,所以特此记录一下
方案一
思路:封装一个组件,将所有新增的参数引入el-dialog 参数中,实现参数共用
新建一个组件,将官网暴露的属性全部引用了
在这里插入图片描述
main.js

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
import ElDialogSp1 from './ElDialogSp1.vue'
const app = createApp(App)

app.use(ElementPlus)
app.component('ElDialogSp1',ElDialogSp1)
app.mount('#app')

ElDialogSp1.vue

<template>
  <el-dialog :title="title" :width="width" :fullscreen="fullscreen" :top="top" :modal="modal" :modal-class="modalClass"
    :append-to-body="appendToBody" :append-to="appendTo" :lock-scroll="lockScroll" :custom-class="customClass"
    :open-delay="openDelay" :close-delay="closeDelay" :close-on-click-modal="closeOnClickModal"
    :close-on-press-escape="closeOnPressEscape" :show-close="showClose" :before-close="beforeClose"
    :draggable="draggable" :overflow="overflow" :center="center" :align-center="alignCenter"
    :destroy-on-close="destroyOnClose" :close-icon="closeIcon" :z-index="ZIndex" :header-aria-level="headerAriaLevel">
    <template v-if="isCommTitle" #header="{ isCommTitle }">
      <span :key="isCommTitle">{{dialogProps.isCommTitle  }} </span>
    </template>
    <slot></slot>
    <template #footer>
      <span>
        <slot name="footer"></slot>
      </span>
    </template>
  </el-dialog>
</template>
<script setup>
import { defineProps, defineComponent } from 'vue'

import { ElDialog } from 'element-plus'
const dialogProps = defineProps({
  isCommTitle: {
    type: String
  },
})
ElDialog.props = Object.assign(ElDialog.props, { ...dialogProps })
console.log('ElDialog', ElDialog)
defineComponent({
  ...ElDialog,
})
</script>
<style scoped></style>

使用组件

<template>
  <el-button plain @click="dialogVisible = true">
    ElDialogSp1
  </el-button>
  
  <el-button plain @click="dialogVisible1 = true">
    ElDialogSp2
  </el-button>

  <ElDialogSp1 :isCommTitle="'没错我是ElDialogSp1的标题'"  v-model="dialogVisible">
    ElDialogSp1中间内容
    <template #footer>
      <el-button plain @click="dialogVisible = false">
        ElDialogSp1
      </el-button>
    </template>
  </ElDialogSp1>
</template>

<script setup>
import {  ref } from "vue";

const dialogVisible = ref(false);
</script>

在这里插入图片描述

方案二
思路:封装一个组件,组件内部嵌套el-dialog,然后定义好公共样式,定义好方法,直接使用
缺陷:因为很多属性定义好了,导致如果超出既定样式的方案就得重新调整代码
main.js

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
import ElDialogSp2 from './ElDialogSp2.vue'
const app = createApp(App)
app.use(ElementPlus)
app.component('ElDialogSp2',ElDialogSp2)
app.mount('#app')

ElDialogSp2.vue

<template>
  <el-dialog v-model="dialogVisible">
    <template #header="{title}">
     <span :key="title"> {{props.title }}</span>
    </template>
    <slot></slot>
    <template #footer>
      <el-button @click="cancel()">Cancel</el-button>
      <el-button type="primary" @click="confirm()">
        Confirm
      </el-button>
    </template>
  </el-dialog>
</template>

<script setup>
import {  ref,watch,defineProps,defineEmits } from "vue";
const emit = defineEmits(['cancel','confirm'])
const props= defineProps({
  dialogVisible:{
    type:Boolean
  },
  title:{
    type: String
  }
})
const dialogVisible = ref(props.dialogVisible)
function cancel() {
  emit('cancel')
}
function confirm() {
  emit('confirm')
}
watch(()=>props.dialogVisible,(newValue)=>{
  dialogVisible.value = newValue
}) 

</script>

使用组件

<template>
  <el-button plain @click="dialogVisible1 = true">
    ElDialogSp2
  </el-button>
  <ElDialogSp2 @confirm="()=>{dialogVisible1= false![请添加图片描述](https://img-blog.csdnimg.cn/direct/c1418a0e2a644e44bedf8a06cd331d52.gif)
}" 
    @cancel="()=>{dialogVisible1= false}"
    :title="'没错我是ElDialogSp2的标题'"  :dialogVisible="dialogVisible1">
    ElDialogSp2中间内容
  </ElDialogSp2>
</template>

<script setup>
import {  ref } from "vue";
const dialogVisible1 = ref(false);
</script>

效果图
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flutter开发实战-外接纹理texture处理图片展示

flutter开发实战-外接纹理处理图片展示 在Flutter中&#xff0c;如果你想要创建一个外接纹理的widget&#xff0c;你可以使用Texture widget。Texture widget用于显示视频或者画布&#xff08;canvas&#xff09;的内容。该组件只有唯一入参textureId 通过外接纹理的方式&…

机器视觉-硬件

机器视觉-硬件 镜头焦距凸透镜焦点不止一个相机镜头由多个镜片组成对焦和变焦 镜头光圈光圈的位置光圈系数F 镜头的景深景深在光路中的几何意义 远心镜头远心镜头的种类远心镜头特性应用场景 镜头的分辨率镜头反差镜头的MTF曲线镜头的靶面尺寸镜头的几何相差相机镜头接口螺纹接…

深度学习设计模式之桥接模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 桥接模式是将抽象部分与实现部分分离&#xff0c;使它们都可以独立的变化。 一、介绍 桥接模式是结构型设计模式&#xff0c;主要是将抽象部分与实现部分分离&#x…

APISIX-简单使用

APISIX-简单使用 这个工具还是很不错的&#xff0c;可视化的配置很清晰 &#xff0c; 想用NGINX的配置模式也是可以的&#xff0c;就是要去修改配置文件了。 APISIX&#xff0c;一个很不错的可视化工具&#xff0c;用来代替Nginx相当不错&#xff0c;可作为Nginx的平替方案&…

【单元测试】如何让单元测试的价值最大化

如何让单元测试的价值最大化 1.背景2.用例设计问题3.边界测试问题4.Mock 测试问题5.与集成测试的分工问题6.单测度量问题7.总结 1.背景 关于 “什么是单元测试”、“为什么要做单元测试”、“怎么做单元测试”&#xff0c;网络上相关的技术文章汗牛充栋。尽管如此&#xff0c;…

大数据之Hive函数大全

&#x1f527; Hive函数大全 更多大数据学习资料请关注公众号“大数据领航员"免费领取 一、数学函数 1、取整函数: round 1.函数描述 返回值语法结构功能描述doubleround(double a)返回double类型的整数值部分&#xff08;遵循四舍五入&#xff09; 2.例程 hive>…

DOS学习-目录与文件应用操作经典案例-copy

欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 copy命令的功能是复制一个或多个已经存在的文件到新的位置&#xff0c;或者将多个文件的内容整合后保存为一个单独的文件&#xff0c;亦或者用于创建批…

SQL基础交互

第二章 检索数据 例如&#xff0c;我们从数据库表 products 中查询 prod_id 和 vend_id,各个列之间以逗号分隔&#xff0c;最后一列的后面不加逗号。 SELECT prod_id, vend_id FROM products; 我们还可以从数据库表中查询所有列。例如: SELECT prod_id, vend_id, prod_name, …

【openlayers系统学习】00官网的Workshop介绍

00Workshop介绍 官方文档&#xff1a;https://openlayers.org/workshop/en/ openlayers官网Workshop学习。 通过官网Workshop&#xff0c;系统学习openlayers的使用。 基本设置 这些说明假定您从最新Workshop版本的 openlayers-workshop-en.zip​ 文件开始。此外&#xff…

继“三级淋巴结”之后,再看看“单细胞”如何与AI结合【医学AI|顶刊速递|05-25】

小罗碎碎念 24-05-25文献速递 今天想和大家分享的是肿瘤治疗领域的另一个热点——单细胞技术&#xff0c;我们一起来看看&#xff0c;最新出炉的顶刊&#xff0c;是如何把AI与单细胞结合起来的。 另外&#xff0c;今天是周末&#xff0c;所以会有两篇文章——一篇文献速递&…

【LeetCode:2769. 找出最大的可达成数字 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

C++—数组

数组是由一批相同类型的元素&#xff08;element&#xff09;的集合所组成的数据结构&#xff0c;分配一块连续的内存来存储。 语法&#xff1a; <数据类型> <数组名>[<数组长度>]; 数据类型&#xff1a;数组内存放的数据类型&#xff0c;如int、char&…

高仿百度网页(附带源码)

高仿百度网页 效果图部分源码及素材领取源码下期更新预报 效果图 部分源码及素材 <script language"javascript">function show_date_time() {window.setTimeout("show_date_time()", 1000);BirthDay new Date("1/20/2023 16:52:21");//…

Mongodb分布式id

1、分布式id使用场景 分布式ID是指在分布式系统中用于唯一标识每个元素的数字或字符串。在分布式系统中&#xff0c;各个节点或服务可能独立运行在不同的服务器、数据中心或地理位置&#xff0c;因此需要一种机制来确保每个生成的ID都是全局唯一的&#xff0c;以避免ID冲突。 …

FreeRTOS 源码概述

FreeRTOS 目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工程中&#xff0c;FreeRTOS 相关的源码如下: 主要涉及2个目录&#xff1a; Core Inc 目录下的 FreeRTOSConfig.h 是配置文件 Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务 Middlewares\Third_Party…

FreeRTOS任务间通信“IPC”

---------------信号量--------------- 信号量的定义&#xff1a; 操作系统中一种解决问题的机制&#xff0c;可以实现 “共享资源的访问” 信号&#xff1a;起通知作用量&#xff1a;还可以用来表示资源的数量当"量"没有限制时&#xff0c;它就是"计数型信…

Java 登录错误次数限制,用户禁登1小时

手机号验证码登录&#xff0c;验证码输入错误次数超5次封禁 Overridepublic boolean checkCaptcha(String phoneNum, String captcha) {String codeNum (String) redisTemplate.opsForValue().get(UserCacheNames.USER_CAPTCHA phoneNum);if (codeNum null) {throw new Wan…

[数据集][目标检测]风力涡轮机缺陷检测数据集VOC+YOLO格式2992张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2992 标注数量(xml文件个数)&#xff1a;2992 标注数量(txt文件个数)&#xff1a;2992 标注…

利用Axure模板快速设计,可视化大屏信息大屏,含近200例资源和各类部件

模板类别&#xff1a; **通用模板&#xff1a;**提供基础的布局和设计元素&#xff0c;适用于各种场景。 **行业特定模板&#xff1a;**如农业、医院、销售、能源、物流、政府机关等&#xff0c;针对不同行业提供专业模板。 **数据展示模板&#xff1a;**包括大数据驾驶舱、统…

【Vue】computed 和 methods 的区别

概述 在使用时&#xff0c;computed 当做属性使用&#xff0c;而 methods 则当做方法调用computed 可以具有 getter 和 setter&#xff0c;因此可以赋值&#xff0c;而 methods 不行computed 无法接收多个参数&#xff0c;而 methods 可以computed 具有缓存&#xff0c;而 met…