需求场景:弹窗组件需要支持自定义的插槽内容,删除的弹窗也要使用这个组件,只是样式不一样而已,希望在父组件使用删除弹窗的时候直接调用某个方法就可以显示弹窗

组件模拟 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 封装函数式弹窗组件的更多相关文章

  1. vue3 vite2 封装 SVG 图标组件 - 基于 vite 创建 vue3 全家桶项目续篇

    在<基于 vite 创建 vue3 全家桶>一文整合了 Element Plus,并将 Element Plus 中提供的图标进行全局注册,这样可以很方便的延续 Element UI 的风 ...

  2. vue3系列:vue3.0自定义全局弹层V3Layer|vue3.x pc桌面端弹窗组件

    基于Vue3.0开发PC桌面端自定义对话框组件V3Layer. 前两天有分享一个vue3.0移动端弹出层组件,今天分享的是最新开发的vue3.0版pc端弹窗组件. V3Layer 一款使用vue3.0 ...

  3. 封装Vue Element的dialog弹窗组件

    我本没有想着说要封装一个弹窗组件,但有同行的朋友在问我,而且弹窗组件也确实在项目开发中用的比较多.思前想后,又本着样式统一且修改起来方便的原则,还是再为大家分享一个我所封装的弹窗组件吧. 其实,并不是 ...

  4. 封装React AntD的dialog弹窗组件

    前一段时间分享了基于vue和element所封装的弹窗组件(封装Vue Element的dialog弹窗组件),今天就来分享一个基于react和antD所封装的弹窗组件,反正所使用的技术还是那个技术, ...

  5. 基于 element-plus 封装一个依赖 json 动态渲染的查询控件

    前情回顾 基于 el-form 封装一个依赖 json 动态渲染的表单控件 Vue3 封装第三方组件(一)做一个合格的传声筒 功能 使用 vue3 + element-plus 封装了一个查询控件,专 ...

  6. 基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用

    在我们实际项目开发过程中,往往需要根据实际情况,对组件进行封装,以更简便的在界面代码中使用,在实际的前端应用中,适当的组件封装,可以减少很多重复的界面代码,并且能够非常简便的使用,本篇随笔介绍基于El ...

  7. Vue.js(24)之 弹窗组件封装

    同事封装了一个弹窗组件,觉得还不错,直接拿来用了: gif图展示: 弹框组件代码: <template> <transition name="confirm-fade&qu ...

  8. vue3系列:vue3.0自定义弹框组件V3Popup|vue3.x手机端弹框组件

    基于Vue3.0开发的轻量级手机端弹框组件V3Popup. 之前有分享一个vue2.x移动端弹框组件,今天给大家带来的是Vue3实现自定义弹框组件. V3Popup 基于vue3.x实现的移动端弹出框 ...

  9. 百度智能小程序弹窗组件wcPop|智能小程序自定义model弹窗模板

    百度智能小程序自定义弹窗组件wcPop|百度小程序model对话框|智能小程序弹窗界面模板 最近百度也推出了自己的智能小程序,如是就赶紧去试了下,官方提供的api还不是狠完整.而且官方提供的弹窗组件也 ...

  10. 微信小程序弹窗组件

    概述 自己封装的一个比较简单微信弹窗小组件,主要就是教会大家对微信小组件的用法和理解,因为微信小程序对组件介绍特别少,所以我就把自己的理解分享给大家 详细 代码下载:http://www.demoda ...

随机推荐

  1. 2022-09-17:一个字符串s,表示仓库的墙 与 货物,其中‘|‘表示墙,‘*‘表示货物。 给定一个起始下标start和一个终止下标end, 找出子串中 被墙包裹的货物 数量。 比如: s = “

    2022-09-17:一个字符串s,表示仓库的墙 与 货物,其中'|'表示墙,''表示货物. 给定一个起始下标start和一个终止下标end, 找出子串中 被墙包裹的货物 数量. 比如: s = &q ...

  2. 2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务,

    2022-05-30:给定一个n*2的二维数组,表示有n个任务. 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务, ...

  3. vue全家桶进阶之路9:常用指令

    以下是一些常见的指令: v-bind - 用于绑定一个或多个属性到组件或 HTML 元素上. v-model - 用于双向绑定一个表单元素或组件的值到数据模型上. v-for - 用于循环遍历一个数组 ...

  4. AHB2APB bridge IP简介

    背景介绍 AMBA总线规范是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高速度.低功耗等特点.AMBA规范中包括了AHB系统总线和APB外设总线. AHB主要用于高性能模 ...

  5. Elasticsearch 之 join 关联查询及使用场景

    在Elasticsearch这样的分布式系统中执行类似SQL的join连接是代价是比较大的,然而,Elasticsearch却给我们提供了基于水平扩展的两种连接形式 .这句话摘自Elasticsear ...

  6. 基于SqlSugar的开发框架循序渐进介绍(31)-- 在查询接口中实现多表联合和单表对象的统一处理

    在一些复杂的业务表中间查询数据,有时候操作会比较复杂一些,不过基于SqlSugar的相关操作,处理的代码会比较简单一些,以前我在随笔<基于SqlSugar的开发框架循序渐进介绍(2)-- 基于中 ...

  7. JS工具函数

    工具函数 用于工程化开发,记录,备用 返回 [min, max) 间的随机整数 /** 返回 [min, max) 间的随机整数 */ export function getRandom(min, m ...

  8. 高精度减法(模板yxc)

    #include <bits/stdc++.h> using namespace std; bool cmp(vector<int> &A, vector<int ...

  9. 从零实现俄罗斯方块(c语言+思路分析)

    俄罗斯方块 文章说明: 本文大部分参考至俄罗斯方块(C语言实现)_c语言俄罗斯方块_2021dragon的博客-CSDN博客,本人经过修改编辑,改变了文章的一些思路顺序,使得新手便于理解(个人想法). ...

  10. 22.04.1 wine8.10 完美安装同花顺最新版THS_9.20.40_20230613

    Linux luma 5.19.0-45-generic #46~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 7 15:06:04 UTC 20 x86_64 ...