经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
vue3 + ElementPlus 封装函数式弹窗组件
来源:cnblogs  作者:奔跑的前端猿  时间:2023/8/11 8:37:55  对本文有异议

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

组件模拟 cuDialog

假设我的弹窗组件有以下的props和事件

  • dialogVisible:控制弹窗显示和隐藏
  • title:弹窗的标题
  • showClose:是否删除弹窗
  • handleClose:弹窗取消的事件
  • handleConfirm:弹窗确定的事件

新建一个js文件

这里需要使用vue3的createApp,方法实现函数式组件调用

  • 导入需要的弹窗组件
    import CuDialog from '@/components/CuDialog.vue'

  • 创建两个全局变量(命名随意),一个是存储createApp创建的组件,一个是放组件的dom

  1. let app = null; let div = null;
  • 定义两个方法,一个是显示弹窗,一个是隐藏弹窗

我这里是把两个方法放在了一个对象里面,方便页面的调用,你们可以根据自己的喜好自由设计

  1. const delMsg = {
  2. show:function() {},
  3. hide:function() {}
  4. }
  • 开始写显示弹窗的方法

首先需要确认show方法要接收的参数,参数的话就是前面列举的那些,三个props和两个事件

  1. function show(props) {
  2. const { title = '温馨提示', delContent = '确定要删除所选记录吗?', confirm, close } = props;
  3. // 创建dom并插入到body中
  4. div = document.createElement('div');
  5. div.setAttribute('id', 'cu-dialog-id');
  6. document.body.appendChild(div);
  7. // 创建组件
  8. app = createApp(CuDialog, {
  9. title, // 弹窗的标题
  10. delContent, // 删除弹窗的内容
  11. dialogVisible: true, // 弹窗显示或隐藏
  12. showClose: true, // 是否删除弹窗
  13. // 弹窗组件暴露的取消事件handleClose
  14. onHandleClose: () => {
  15. close && close();
  16. console.log('触发函数内取消事件');
  17. app.unmount();
  18. div.remove();
  19. },
  20. // 弹窗组件暴露的取消事件handleConfirm
  21. onHandleConfirm: () => {
  22. confirm && confirm();
  23. console.log('触发函数内确认事件');
  24. }
  25. });
  26. app.mount(div);
  27. }
  • 隐藏弹窗方法
  1. function hide() {
  2. app.unmount();
  3. div.remove();
  4. }
  • 导出方法
    export default delMsg;

使用方法

  1. import delMsg from '@utils/delMessage.js'
  2. delMsg.show({title:'弹窗标题',delContent:'弹窗的内容',confirm:() =>{
  3. console.log('确认事件触发');
  4. delMsg.hide();
  5. },close:() => {
  6. console.log('取消事件触发')
  7. }})

完整代码

  1. import CuDialog from '@/components/CuDialog.vue';
  2. let app = null;
  3. let div = null;
  4. const delMsg = {
  5. /**
  6. * @param {Object} props
  7. * @param {String} title 弹窗的标题,不传默认 ‘温馨提示’
  8. * @param {String} delContent 弹窗的内容,不传默认 ‘确定要删除所选记录吗?’
  9. * @param {Boolean} autoClose 取消事件是否需要特殊处理,设置false需要手动调用hide方法,不传默认true
  10. * @param {Function} confirm 弹窗确认事件
  11. * @param {Function} close 弹窗关闭事件
  12. */
  13. show: function (props) {
  14. const { title = '温馨提示', delContent = '确定要删除所选记录吗?', autoClose = true, confirm, close } = props;
  15. div = document.createElement('div');
  16. div.setAttribute('id', 'cu-dialog-id');
  17. document.body.appendChild(div);
  18. // eslint-disable-next-line vue/one-component-per-file
  19. app = createApp(CuDialog, {
  20. title,
  21. delContent,
  22. dialogVisible: true,
  23. showClose: true,
  24. onHandleClose: () => {
  25. close && close();
  26. console.log('触发函数内取消事件');
  27. // 如果需要默认关闭,不做任何逻辑处理请将autoClose设置为true(默认就是true)
  28. if (autoClose) {
  29. app.unmount();
  30. div.remove();
  31. }
  32. },
  33. onHandleConfirm: () => {
  34. confirm && confirm();
  35. console.log('触发函数内确认事件');
  36. }
  37. });
  38. app.mount(div);
  39. },
  40. hide: function () {
  41. app.unmount();
  42. div.remove();
  43. }
  44. };
  45. export default delMsg;

原文链接:https://www.cnblogs.com/sxdpanda/p/17616231.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号