work-notes(12):如何二次封装 Element UI 的 dialog 弹窗,发现弹窗只能点击触发一次是什么原因,如何解决弹窗只能触发一次的问题?

这篇具有很好参考价值的文章主要介绍了work-notes(12):如何二次封装 Element UI 的 dialog 弹窗,发现弹窗只能点击触发一次是什么原因,如何解决弹窗只能触发一次的问题?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

时间:2022-05-15

问题描述

前些天,公司要求制作一个私库,并且是在 element UI 的组件上进行二次封装,所以引生出一些问题,作为记录;

(1)如何进行二次封装 element UI 的 dialog 弹窗?

(2)弹窗为什么只能点击触发一次,第二次之后都没有反应?
	原因是,你没有传入一个 close 事件;
	1)当你第一次点击时,子组件里面的 visible 可视变成了 true,你点击关闭的时候,
	2)没有传入 close 事件,导致你 子组件里面的 visible 还是 true,所以点击没反应;

问题分析

1、如何二次封装 element UI 的 dialog 弹窗?

(1)首先可以确定,类似于封装成一个子组件,然后把对应的 宽等值 传入即可;

(2)把传入的值,绑定到子组件的标签上;

2、实现过程

(1)在 script 标签 中 props 传入值
 props: {
   //  是否可视
   isVisible: {
     type: Boolean,
     required: true,
   },
   //  弹窗宽度,百分比。默认50%
   dialogWidth: {
     type: [Number, String],
     default: "50%",
   },
   //  是否展现关闭按钮
   showClose: {
     type: [Number, String],
   },
   // apend-to-body 值,用于嵌套弹窗
   apendToBody: {
     type: Boolean,
   },
   // 头部 title 背景图宽度
   titleBackgroundWidth: {
     type: [Number, String],
     default: "320",
   },
   // title 名称
   titleText: {
     type: String,
     required: true,
   },
   // pop_img 头部背景图片颜色,当为 true 时为深暗色,为 false 时为 浅色;
   popImgColor: {
     type: [Boolean, String],
   },
 },
(2)绑定到 dialog 标签内
主要我这里是用那个自定义 dialog;
主要结构:
<el-dialog>
	// 头部标题
	<template #title> </template>
	// 身体
	<template #default> </template>
 </el-dialog>
个人例子:
<template>
  <el-dialog
    class="dialog_box"
    top="5vh"
    :destroy-on-close="true"
    close-on-press-escape
    v-model="isVisible"
    :width="dialogWidth"
    :show-close="showClose"
    :append-to-body="apendToBody"
    :before-close="onClose"
  >
    <!-- 头部 -->
    <template #title>
      <div
        class="dialog_title"
        :style="{ width: titleBackgroundWidth + 'px' }"
        :class="[popImgColor === 'true' ? 'pop_img_color' : '']"
      >
        <span>{{ titleText }}</span>
      </div>
    </template>

    <!-- 身体 -->
    <template #default>
      <!-- 作为插槽,引入其他组件的 body 部分 -->
      <slot></slot>
    </template>
  </el-dialog>
</template>
解释
(1)在 dialog 标签下的 是默认 element UI 的值;传入值可以直接绑定进去;
(2)其他 div 就是自己写的;
	绑定方式可以绑定在 class(:class) 、style(:style);

绑定 class style 的写法详细,这是我之前写的博客

3、弹窗为什么只能点击触发一次,第二次之后都没有反应?

上面已经描述了为什么第二次之后没有反应的原因;
下面就讲方向;

(1)在调用的页面传入一个 close 函数;

(2)在子组件内部进行绑定,绑定位置很特别,而且思维也很灵巧;

4、实现过程

(1)在调用的页面写一个 close 函数传入;

close方法很简单,就把传入的值 visible 变成 false;文章来源地址https://www.toymoban.com/news/detail-410635.html

// 关闭弹窗方法
dialogClose() {
  this.visible = false;
},
个人例子
(1)传入的 方法绑定到 @on-close="dialogClose";
<template>
  <div v-if="visible">
    <!-- 实际 弹窗组件 标签 -->
    <zwcom-dialog
      :isVisible="visible"
      @on-close="dialogClose"
    >
      <div>弹窗体内容,身体默认由内容撑开</div>
    </zwcom-dialog>
  </div>
</template>


<script>
export default {
  data() {
    return {
      visible: false,
    };
  },
  methods: {
    // 关闭弹窗方法
    dialogClose() {
      this.visible = false;
    },
  },
};
</script>
(2)在子组件内部进行绑定
这里我就删除过多的内容,仅保留例子内容;

(1)内部就是 emits 接受,但是我这里写在 methods 里面用方法进行调用;【巧妙1】
(2)再把这个方法,绑定在element UI 的 dialog 标签的 before-close 事件里;【巧妙2】

解释:
1)父组件传进来的函数绑定到函数里面,这样简单易懂;
2)绑定到 before-close;
	①原本 before-close 用法是,当弹窗点击蒙版自动关闭时,弹出弹窗需要二次确认关闭;
		这里直接调用父组件的函数,直接把 visivle = false;就可以实现关闭,这就是巧妙之处;
具体内部调用
 methods: {
  //关闭弹框
   onClose() {
     this.$emit("on-close");
   },
 },
个人例子
<template>
  <el-dialog  
    v-model="isVisible"
    :before-close="onClose"
   >
    <!-- 头部 -->
    <template #title> </template>

    <!-- 身体 -->
    <template #default>
      <!-- 作为插槽,引入其他组件的 body 部分 -->
      <slot></slot>
    </template>
  </el-dialog>
</template>

<script>
export default {
  name: "zwcom-dialog",
  data() {
    return {};
  },
  props: {
    //  是否可视
    isVisible: {
      type: Boolean,
      required: true,
    },
  },
  emits: [],
  methods: {
    //关闭弹框
    onClose() {
      this.$emit("on-close");
    },
  },
  watch: {},
};
</script>

到了这里,关于work-notes(12):如何二次封装 Element UI 的 dialog 弹窗,发现弹窗只能点击触发一次是什么原因,如何解决弹窗只能触发一次的问题?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue2.x 二次封装element ui 中的el-dialog

    在做后台管理系统的时候,dialog组件是我们使用频率比较高的组件,但是有一些需求现有的组件是不满足的。因此会需要我们做二次封装。 组件本身的属性我们保留,只需要根据需求添加,然后在使用的时候props去拿取使用就可以了。 本次遇到的问题是如何在父组件去控制

    2024年02月07日
    浏览(59)
  • element ui 表格组件与分页组件的二次封装 【扩展】vue中的render函数

    目录 效果图  组件封装  parseTime函数 debounce 函数 render通用渲染模版 页面使用 【扩展】vue 函数式组件 函数式组件特点: 函数式组件的优点: 【扩展】vue中的render函数 一、初步认识render函数 二、为什么使用render函数 三、render函数的解析 【扩展】添加操作栏显示权限 结构

    2024年02月09日
    浏览(83)
  • element ui多选下拉组件(el-select)tag数量过多处理解决办法(二次封装)

    如下图所示,当标签选择过多时,会占用过多空间 期待效果:超过n行就自动省略,并可以进行展开收起,下图是实现后的效果图 实现分析: 通过extends继承el-select组件 将select源码的template部分粘贴到封装的组件中,以此来操作展开、收起等需要操作dom的部分 监听selected(已选择

    2024年02月13日
    浏览(50)
  • vue+element-ui el-table组件二次封装实现虚拟滚动,解决数据量大渲染DOM过多而卡顿问题

    某些页面不做分页时,当数据过多,会导致页面卡顿,甚至卡死 一、固定一个 可视区域 的大小并且其大小是不变的,那么要做到性能最大化就需要尽量少地渲染 DOM 元素,而这个最小值也就是可视范围内需要展示的内容,而可视区域之外的元素均可以不做渲染。 二、如何计

    2024年02月10日
    浏览(64)
  • element-ui 抽屉组件(el-drawer ) 二次封装 增加resize拖曳改变宽度大小,配合表格实现快捷方式打开抽屉展示详情及操作

    可配合自定义表格进行操作数据,点击表格某一行进行抽屉展示,可上下页切换查看及功能操作,1.快捷键esc关闭抽屉,// 快捷键控制上下翻页  shiftKey+上键 上一页    shiftKey加下键 下一页  shiftKey加左键 开启弹框展示第一条数据   shiftKey加右键关闭弹框   上代码

    2024年02月12日
    浏览(49)
  • Element Plus二次封装el-table、可编辑表格

    一、需求 在后台管理项目中,可以显而易见的见到表格组件,为了方便我们会把表格组件进行二次封装,即方便了开发,也方便了维护。 2023年04月01日更新单元格编辑功能 扩展 el-table 扩展【表格动态列展示】 整合版本,附带查询,分页,表头自定义展示,等其他功能。 注

    2024年02月07日
    浏览(50)
  • vue3组件二次封装Ui处理

    在Vue开发中,我们常常需要使用UI框架提供的组件。但是UI框架的组件可能并不符合我们的需求,这时候就需要进行二次封装。下面是一些关于Vue组件二次封装Ui处理的技巧: 子组件代码: 父组件使用: 如果使用props接收弊端: 基本上组件不会只有一两个属性,属性多的话接

    2023年04月14日
    浏览(83)
  • vue3 element-plus el-form的二次封装

    form表单的二次封装 vue3 element-plus el-form的二次封装 属性名 类型 默认值 说明 data Array [] 页面展示数据内容 onChange Function false 表单事件 bindProps Object {} 表单属性 formRef Object {} 表单ref ruleForm Object {} 数据

    2024年02月13日
    浏览(74)
  • Vue2自己封装的基础组件库或基于Element-ui再次封装的基础组件库,如何发布到npm并使用(支持全局或按需引入使用),超详细

    以下我以 wocwin-admin-vue2 项目为例 修改目录结构,最终如下 1、导入组件,组件必须声明 name 2、定义 install 方法,接收 Vue 作为参数。如果使用 use 注册插件,则所有的组件都将被注册 3、导出的对象必须具有 install,才能被 Vue.use() 方法安装(全局使用) 4、按需引入 5、packa

    2024年02月08日
    浏览(82)
  • vue3 基于element plus对el-pagination进行二次封装

    在vue3项目中,如果每个列表页都敲一遍分页方法,显然是不合理的,那么,下面我将基于element plus对el-pagination进行二次封装,使用vue3语法糖格式,废话不多说,开干。

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包