vue3 + ElementPlus 封装函数式弹窗组件
需求场景:弹窗组件需要支持自定义的插槽内容,删除的弹窗也要使用这个组件,只是样式不一样而已,希望在父组件使用删除弹窗的时候直接调用某个方法就可以显示弹窗
组件模拟 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 封装函数式弹窗组件的更多相关文章
- vue3 vite2 封装 SVG 图标组件 - 基于 vite 创建 vue3 全家桶项目续篇
在<基于 vite 创建 vue3 全家桶>一文整合了 Element Plus,并将 Element Plus 中提供的图标进行全局注册,这样可以很方便的延续 Element UI 的风 ...
- vue3系列:vue3.0自定义全局弹层V3Layer|vue3.x pc桌面端弹窗组件
基于Vue3.0开发PC桌面端自定义对话框组件V3Layer. 前两天有分享一个vue3.0移动端弹出层组件,今天分享的是最新开发的vue3.0版pc端弹窗组件. V3Layer 一款使用vue3.0 ...
- 封装Vue Element的dialog弹窗组件
我本没有想着说要封装一个弹窗组件,但有同行的朋友在问我,而且弹窗组件也确实在项目开发中用的比较多.思前想后,又本着样式统一且修改起来方便的原则,还是再为大家分享一个我所封装的弹窗组件吧. 其实,并不是 ...
- 封装React AntD的dialog弹窗组件
前一段时间分享了基于vue和element所封装的弹窗组件(封装Vue Element的dialog弹窗组件),今天就来分享一个基于react和antD所封装的弹窗组件,反正所使用的技术还是那个技术, ...
- 基于 element-plus 封装一个依赖 json 动态渲染的查询控件
前情回顾 基于 el-form 封装一个依赖 json 动态渲染的表单控件 Vue3 封装第三方组件(一)做一个合格的传声筒 功能 使用 vue3 + element-plus 封装了一个查询控件,专 ...
- 基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用
在我们实际项目开发过程中,往往需要根据实际情况,对组件进行封装,以更简便的在界面代码中使用,在实际的前端应用中,适当的组件封装,可以减少很多重复的界面代码,并且能够非常简便的使用,本篇随笔介绍基于El ...
- Vue.js(24)之 弹窗组件封装
同事封装了一个弹窗组件,觉得还不错,直接拿来用了: gif图展示: 弹框组件代码: <template> <transition name="confirm-fade&qu ...
- vue3系列:vue3.0自定义弹框组件V3Popup|vue3.x手机端弹框组件
基于Vue3.0开发的轻量级手机端弹框组件V3Popup. 之前有分享一个vue2.x移动端弹框组件,今天给大家带来的是Vue3实现自定义弹框组件. V3Popup 基于vue3.x实现的移动端弹出框 ...
- 百度智能小程序弹窗组件wcPop|智能小程序自定义model弹窗模板
百度智能小程序自定义弹窗组件wcPop|百度小程序model对话框|智能小程序弹窗界面模板 最近百度也推出了自己的智能小程序,如是就赶紧去试了下,官方提供的api还不是狠完整.而且官方提供的弹窗组件也 ...
- 微信小程序弹窗组件
概述 自己封装的一个比较简单微信弹窗小组件,主要就是教会大家对微信小组件的用法和理解,因为微信小程序对组件介绍特别少,所以我就把自己的理解分享给大家 详细 代码下载:http://www.demoda ...
随机推荐
- Django, urls的参数name的demo
Django的路由变化 遇到需要修改路由的需求,特别记录一下 项目开始 django-admin startproject sandboxOA. # 外部文件夹可以改变名字, '.'的意思是上一级不需 ...
- 2023-03-19:使用Go语言和FFmpeg库实现pcm编码为mp3。
2023-03-19:使用Go语言和FFmpeg库实现pcm编码为mp3. 答案2023-03-19: 本文将介绍如何使用Go语言和FFmpeg库实现PCM音频文件编码为MP3格式.我们将使用moon ...
- 2022-02-16:将数组分割成和相等的子数组。 给定一个有 n 个整数的数组,你需要找到满足以下条件的三元组 (i, j, k) : 0 < i, i + 1 < j, j + 1 < k < n
2022-02-16:将数组分割成和相等的子数组. 给定一个有 n 个整数的数组,你需要找到满足以下条件的三元组 (i, j, k) : 0 < i, i + 1 < j, j + 1 & ...
- 码云SSH公钥及仓库建设
码云SSH公钥及仓库建设 第一步注册码云账号并按图示点击 在新打开的界面,按图示点击 进入点击如下图步骤 然后照着做下图 ssh-keygen -t rsa -C "xxxxx@xxxxx. ...
- R数据分析:多项式回归与响应面分析的理解与实操
今天给大家分享一个新的统计方法,叫做响应面分析,响应面分析是用来探究变量一致性假设的(Congruence hypotheses).本身是一个工程学方法,目前在组织行为学,管理,市场营销等等领域中使用 ...
- Anaconda 使用的一些体验与困惑
Channels 使用 需要注意的是做生信分析的童鞋使用 conda 环境时一定要特别注意 conda channels 的设置,滥用 channels 很有可能会导致你的软件升降级(甚至环境)错乱. ...
- 关于int**在malloc为二维数组分配空间时候的作用见解
关于int**在用malloc函数为二维数组分配空间时候 int** 二级指针类型 二维数组的数组名为行指针,写成 arr =(char**)malloc(n*sizeof(char))时,a ...
- uniapp主题切换功能的第二种实现方式(scss变量+require)
在上一篇 "uniapp主题切换功能的第一种实现方式(scss变量+vuex)" 中介绍了第一种如何切换主题,但我们总结出一些不好的地方,例如扩展性不强,维护起来也困难等等,那么接 ...
- 【技术积累】Linux中的基础知识【二】
Linux的发行版本 Linux是一个开源操作系统,有许多发行版,每个发行版都有自己的特点和优势.以下是一些常见的Linux发行版: Ubuntu:Ubuntu是最受欢迎的Linux发行版之一,它拥有 ...
- 微信公众号redirect_uri 参数错误
前期所有准备工作我就不在这里一一叙述了.在这说一下需要注意的事项: 1.如果域名为www开头,记得把www去掉,否则依旧会报这个错误 2.跳转域名必须是授权域名的子集,如:'授权域名为 www.bai ...