element-ui 弹窗组件封装的步骤


Posted in Javascript onJanuary 22, 2021

封装el-dialog为一个组件

我们在使用element-ui的时候,如果一个弹窗中的内容很多,那么我们经常会把这个弹窗封装成一个组件,如下:

<!-- DetailDialog.vue html -->
<template>
 <el-dialog title="标题" :visible.sync="visible" width="720px" >
  <p>弹窗内容</p>
 </el-dialog>
</template>
// DetailDialog.vue js
<script>
 props: {
  visible: {
   type: Boolean,
   default: false
  }
 }
</script>

el-dialog会修改 props,并报错

但是这样会有一个问题,当触发了el-dialog内部的关闭事件时, 比如点击弹窗阴影等, 它会emit事件来修改当前组件的props [visible],由于组件不能直接修改prop属性,然后就会报错。

我们新增了一个中间变量innerVisible,来拦截props [visible]的修改和获取

<!-- DetailDialog.vue html -->
<template>
 <el-dialog title="标题" :visible.sync="innerVisible" width="720px" >
  <p>弹窗内容</p>
 </el-dialog>
</template>
// DetailDialog.vue js
<script>
export default {
 props: {
  visible: {
   type: Boolean,
   default: false
  }
 },
 computed: {
  innerVisible: {
   get: function() {
    return this.visible
   },
   set: function(val) {
    this.$emit('update:visible', val)
   }
  }
 }
}
</script>

这样在el-dialog内部修改prop[visible]的时候,我们会通过emit('update:')的方式来通知父组件,避免直接修改props。当然父组件需要加上sync修饰符来接受修改:

<!-- father.vue html -->
<DetailDialog :visible.sync="detailVisible" />

到此为止,封装的弹窗组件已经没有问题了。

继续优化,使用v-model控制显示隐藏

// DetailDialog.vue js
<script>
export default {
 model: {
  prop: 'visible', // 修改 v-model 绑定的props名称
  event: 'toggle' // 修改 v-model 绑定的自定义事件名
 },
 props: {
  visible: {
   type: Boolean,
   default: false
  }
 },
 computed: {
  innerVisible: {
   get: function() {
    return this.visible
   },
   set: function(val) {
    this.$emit('update:toggle', val)
   }
  }
 }
}
</script>

接入了v-model,使用起来就更高大上而且整洁了

<!-- father.vue html -->
<DetailDialog v-model="detailVisible" />

继续优化,封装成mixins

当频繁封装弹窗组件时,那么上述逻辑也需要不停地复制,所以继续优化,把上述控制显示隐藏的逻辑封装成了mxins,直接复用即可

// vModelDialog.js
export default {
 model: {
  prop: 'visible',
  event: 'toggle'
 },
 props: {
  visible: {
   type: Boolean,
   default: () => {
    return false
   }
  }
 },
 computed: {
  innerVisible: {
   get: function() {
    return this.visible
   },
   set: function(val) {
    this.$emit('toggle', val)
   }
  }
 }
}

那么封装弹窗插件时,只需引入mixins即可完成显示隐藏逻辑。

// DetailDialog.vue js
<script>
import vModelDialog from './vModelDialog.js'
export default {
 mixins: [vModelDialog],
}
</script>

以上就是element-ui 弹窗组件封装的步骤的详细内容,更多关于element-ui 弹窗组件封装的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JavaScript 组件之旅(一)分析和设计
Oct 28 Javascript
js 省地市级联选择
Feb 07 Javascript
IE6,IE7下js动态加载图片不显示错误
Jul 17 Javascript
JS基础之undefined与null的区别分析
Aug 08 Javascript
javascript检测浏览器的缩放状态实现代码
Sep 28 Javascript
js实现照片墙功能实例
Feb 05 Javascript
js网页滚动条滚动事件实例分析
May 05 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 Javascript
bootstrap flask登录页面编写实例
Nov 01 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
Feb 26 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
May 14 Javascript
Vue父子组件传值的一些坑
Sep 16 Javascript
动态实现element ui的el-table某列数据不同样式的示例
Jan 22 #Javascript
原生js实现放大镜组件
Jan 22 #Javascript
Vue仿Bibibili首页的问题
Jan 21 #Vue.js
如何在vue 中使用柱状图 并自修改配置
Jan 21 #Vue.js
Vue看了就会的8个小技巧
Jan 21 #Vue.js
原生js实现滑块区间组件
Jan 20 #Javascript
原生js实现下拉框选择组件
Jan 20 #Javascript
You might like
解析htaccess伪静态的规则
2013/06/18 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
PHP7匿名类用法分析
2016/09/26 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
PHP中trait使用方法详细介绍
2017/05/21 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
简单的JS多重继承示例
2008/03/13 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
安装python及pycharm的教程图解
2019/10/10 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
explicit和implicit的含义
2012/11/15 面试题
亿企通软件测试面试题
2012/04/10 面试题
体育教师工作总结的自我评价
2013/10/10 职场文书
网吧消防安全制度
2014/01/28 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
民事赔偿协议书
2014/11/02 职场文书
法务专员岗位职责
2015/02/14 职场文书
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers