vue3 + ElementPlus 封装函数式弹窗组件
2023-08-09 23:53:57 来源:博客园
(资料图片仅供参考)
组件模拟需求场景:弹窗组件需要支持自定义的插槽内容,删除的弹窗也要使用这个组件,只是样式不一样而已,希望在父组件使用删除弹窗的时候直接调用某个方法就可以显示弹窗
cuDialog
假设我的弹窗组件有以下的props和事件
dialogVisible:控制弹窗显示和隐藏title:弹窗的标题showClose:是否删除弹窗handleClose:弹窗取消的事件handleConfirm:弹窗确定的事件新建一个js文件这里需要使用vue3的
createApp
,方法实现函数式组件调用
导入需要的弹窗组件import CuDialog from "@/components/CuDialog.vue"
创建两个全局变量(命名随意),一个是存储createApp创建的组件,一个是放组件的dom
let app = null; let div = null;
定义两个方法,一个是显示弹窗,一个是隐藏弹窗我这里是把两个方法放在了一个对象里面,方便页面的调用,你们可以根据自己的喜好自由设计
const delMsg = { show:function() {}, hide:function() {}}
开始写显示弹窗的方法首先需要确认show方法要接收的参数,参数的话就是前面列举的那些,三个props和两个事件
function show(props) { const { title = "温馨提示", delContent = "确定要删除所选记录吗?", confirm, close } = props; // 创建dom并插入到body中 div = document.createElement("div"); div.setAttribute("id", "cu-dialog-id"); document.body.appendChild(div); // 创建组件 app = createApp(CuDialog, { title, // 弹窗的标题 delContent, // 删除弹窗的内容 dialogVisible: true, // 弹窗显示或隐藏 showClose: true, // 是否删除弹窗 // 弹窗组件暴露的取消事件handleClose onHandleClose: () => { close && close(); console.log("触发函数内取消事件"); app.unmount(); div.remove(); }, // 弹窗组件暴露的取消事件handleConfirm onHandleConfirm: () => { confirm && confirm(); console.log("触发函数内确认事件"); } }); app.mount(div);}
隐藏弹窗方法function hide() { app.unmount(); div.remove();}
导出方法export default delMsg;
使用方法import delMsg from "@utils/delMessage.js"delMsg.show({title:"弹窗标题",delContent:"弹窗的内容",confirm:() =>{ console.log("确认事件触发"); delMsg.hide();},close:() => { console.log("取消事件触发")}})
完整代码import CuDialog from "@/components/CuDialog.vue";let app = null;let div = null;const delMsg = { /** * @param {Object} props * @param {String} title 弹窗的标题,不传默认 ‘温馨提示’ * @param {String} delContent 弹窗的内容,不传默认 ‘确定要删除所选记录吗?’ * @param {Boolean} autoClose 取消事件是否需要特殊处理,设置false需要手动调用hide方法,不传默认true * @param {Function} confirm 弹窗确认事件 * @param {Function} close 弹窗关闭事件 */ show: function (props) { const { title = "温馨提示", delContent = "确定要删除所选记录吗?", autoClose = true, confirm, close } = props; div = document.createElement("div"); div.setAttribute("id", "cu-dialog-id"); document.body.appendChild(div); // eslint-disable-next-line vue/one-component-per-file app = createApp(CuDialog, { title, delContent, dialogVisible: true, showClose: true, onHandleClose: () => { close && close(); console.log("触发函数内取消事件"); // 如果需要默认关闭,不做任何逻辑处理请将autoClose设置为true(默认就是true) if (autoClose) { app.unmount(); div.remove(); } }, onHandleConfirm: () => { confirm && confirm(); console.log("触发函数内确认事件"); } }); app.mount(div); }, hide: function () { app.unmount(); div.remove(); }};export default delMsg;
关键词:
相关阅读
-
vue3 + ElementPlus 封装函数式弹窗组件
>需求场景:弹窗组件需要支持自定义的插槽内容,删除的弹窗也要使用这 -
第16届国际龙舟锦标赛中国东莞麻涌龙舟...
中新网曼谷8月9日电(李映民李获)第16届国际龙舟锦标赛8月7至13日在泰国 -
荆浩画院暨太行山国际写生基地在壶关揭牌
8月5日,荆浩画院暨太行山国际写生基地成立仪式在长治市壶关县举行。中 -
“太原老葛乡村振兴公益助农直播山西专...
7月29日,由山西省工商业联合会主办,山西省商务厅、山西省农业农村厅 -
山西太原一商场男厕所贴有女性低俗海报...
8月8日,山西太原,有网友爆料称处于核心地段的茂业百货,男厕所内贴有 -
四川遂宁:消费纠纷跨区域 高效维权暖民心
为服务成渝地区双城经济圈建设,四川省遂宁市与重庆市铜梁区、潼南区、 -
赔本赚吆喝!电芯报价跌至历史冰点
今年以来,动力电池产业可谓命途多舛,年初碳酸锂价格“恐慌式”下... -
大力发展现代种业 助力简阳乡村振兴
简阳市融媒体中心乡村要振兴,产业兴旺是关键。近年来,我市锚定产业发 -
四川雅安突发!已致7人遇难
据央视新闻消息,8月9日上午10时许,四川雅安雨城区鱼鳞坝,十余名游客 -
54岁的王菲:恋爱中,已退休
今天是王菲的生日。又到了一年一度“谢谢王菲”的日子! 图源... -
朱金龙(对于朱金龙简单介绍)
聊聊一篇金龙,对于朱金龙简单介绍的文章,网友们对这件事情都比较关注 -
28岁女博士研究长生不老药,融资5800万...
“长生不老,先从毛孩子做起。救你的狗命,她是认真的。”作者|王王... -
张家港经开区(杨舍镇):“板凳夜话”...
凉风拂面,虫鸣阵阵,一场场热闹的“板凳夜话”网格民情交流会就这... -
为外卖小哥送上关心和关爱!苏州工业园...
炎炎烈日,酷暑难消,外卖小哥这一新就业群体是夏日街头最常见的户外劳 -
卖鸡卖猪都赔钱,养殖龙头亏6亿
图片来源@视觉中国今年以来,白羽肉鸡和黄羽肉鸡价格走势出现分化, -
医大医院首批患者完成全飞秒摘镜 专家...
受访者供图,下同伴随着暑期的到来,沪上各大医院眼科又迎来一波近视手 -
台州黄岩澄江街道:微改造让“美丽经济...
流火七月,绿意葱茏,水波清澈。不规则文化石垒砌的logo标识耸立村口, -
“增持中国”成全球金融机构共识
据巴西《论坛》杂志网站8月7日报道,近些天来,越来越多的全球金融机构 -
台风“卡努”外围云系10日凌晨开始影响...
原标题:台风“卡努”外围云系10日凌晨开始影响吉林省9日,中国吉林... -
第二期“彩云绿色智能家电消费券”将于8...
云南网讯(记者 杨萍)为持续实施家电消费惠民政策,云南省商务厅将于