当前位置: 首页 > news >正文

20.弹窗组件封装

弹窗组件封装

官网:组件 | Element

1. components下面新建SyDialog.vue组件

<template><el-dialog:title="props.title":model-value="props.visible":width="props.width +'px'":before-close="onClose"><!-- :close-on-click-modal="false" 点击弹框外面不关闭弹框 --><!-- 内容显示区 --><div class="container" :style="{ height: height + 'px' }"><!-- 内容显示区插槽 --><slot name="content"></slot></div><template #footer><span class="dialog-footer"><el-button type="danger" @click="onClose">取消</el-button><el-button type="primary" @click="onConfirm">确定</el-button></span></template></el-dialog>
</template><script setup lang="ts">
//弹框数据类型
interface DialogProps {title: string;visible: boolean;width: number;height: number;
}
//接收父组件传递的参数
const props = withDefaults(defineProps<DialogProps>(), {title: "新增",visible: false,width: 630,height: 280,
});
//注册事件
const emit = defineEmits(["onClose", "onConfirm"]);
//弹框关闭
const onClose = () => {emit("onClose");
};
//弹框确定
const onConfirm = () => {emit("onConfirm");
};
</script><style lang="scss" >
.container {overflow-x: initial;overflow-y: auto;
}
.el-dialog {border-top-left-radius: 7px !important;border-top-right-radius: 7px !important;.el-dialog__header {width: 101.1%;margin-top: -16px;margin-left: -16px;padding: 13px;border-top-left-radius: 7px !important;border-top-right-radius: 7px !important;background-color: #0a2542 !important;.el-dialog__title {color: #fff;font-size: 16px;font-weight: 600;}}.el-dialog__headerbtn {.el-dialog__close {color: #fff;}}.el-dialog__body {padding: 10px;}.el-dialog__footer {border-top: 1px solid #e8eaec !important;padding: 10px;}
}
</style>

2. 在dashboard中测试

<template><div>首页<el-button type="primary" size="default" @click="addBtn">新增</el-button><SyDialog:title="dialog.title":visible="dialog.visible"></SyDialog></div>
</template><script setup lang="ts">
import SyDialog from '@/components/SyDialog.vue';
import { reactive } from 'vue';//定义弹框属性
const dialog = reactive({title: '新增',visible: false,})//按钮点击事件
const addBtn = () => {dialog.visible = true;
}
</script><style scoped lang="scss"></style>

3.抽离弹框添加方式

  1. 新建文件夹hooks在src下
    是重复使用的代码片段

  2. 弹窗hooks封装

    import { reactive } from "vue";
    export default function useDialog() {//弹框属性const dialog = reactive({title: "新增",visible: false,width: 630,height: 280});//弹框关闭const onClose = () => {dialog.visible = false};//弹框确定const onConfirm = () => {dialog.visible = false};//弹框显示const onShow = () => {dialog.visible = true;}return {dialog,onClose,onConfirm,onShow}
    }
    
    <template><div>首页<el-button type="primary" size="default" @click="addBtn">新增</el-button><SyDialog:title="dialog.title":visible="dialog.visible"append-to-body:close-on-click-modal="false"@on-close="onClose"@on-confirm="onConfirm"><template v-slot:content>111</template></SyDialog></div>
    </template><script setup lang="ts">
    import SyDialog from '@/components/SyDialog.vue';
    // import { reactive } from 'vue';
    import useDialog from '@/hooks/useDialog';
    //获取弹框方法
    const { dialog,onClose,onConfirm,onShow } = useDialog()//定义弹框属性
    // const dialog = reactive({
    //     title: '新增',
    //     visible: false,// })//按钮点击事件
    const addBtn = () => {onShow()
    };</script><style scoped lang="scss"></style>
    

4. 效果图

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux【4】拷贝移动 文件内容
  • 云计算的成本:您需要了解的 AWS 定价信息
  • stm32 8080时序驱动lcd屏幕
  • PDM系统详细介绍
  • Spring Cloud全解析:负载均衡之Ribbon简介
  • <计算机网络>笔记1: TCP/IP五层协议
  • Android 存储之 SharedPreferences 框架体系编码模板
  • 【ZYNQ MPSoC开发】lwIP TCP发送用于数据缓存的软件FIFO设计
  • 【C++11】深入理解与应用右值引用
  • GPT教我学【这天学的物理知识】速度的相对性
  • DAY14:一条SQL查询语句是如何执行的?| 事务的四大特性有哪些?| 数据库的事物隔离级别有哪些
  • 区块链开发解决方案有哪些
  • 【LVI-SAM】激光点云如何辅助视觉特征深度提取
  • bps,bit,Byte,字符,字节,Mbps,Kbps,bps,MB,KB,B这些单位的区别与联系
  • jEasyUI 创建 CRUD 数据网格
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • angular2开源库收集
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • HTTP请求重发
  • iOS编译提示和导航提示
  • JAVA SE 6 GC调优笔记
  • js
  • Js基础——数据类型之Null和Undefined
  • linux安装openssl、swoole等扩展的具体步骤
  • python docx文档转html页面
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Vim Clutch | 面向脚踏板编程……
  • vue--为什么data属性必须是一个函数
  • Webpack 4x 之路 ( 四 )
  • 编写高质量JavaScript代码之并发
  • 回流、重绘及其优化
  • 利用DataURL技术在网页上显示图片
  • 前言-如何学习区块链
  • 用jquery写贪吃蛇
  • zabbix3.2监控linux磁盘IO
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​TypeScript都不会用,也敢说会前端?
  • ​浅谈 Linux 中的 core dump 分析方法
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #pragma data_seg 共享数据区(转)
  • #每日一题合集#牛客JZ23-JZ33
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)计算机毕业设计高校学生选课系统
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四)事件系统
  • (五)activiti-modeler 编辑器初步优化
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (杂交版)植物大战僵尸
  • (转)Linq学习笔记
  • (转)visual stdio 书签功能介绍
  • (自用)仿写程序
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案