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 汉字字节判断
Aug 01 Javascript
基于jquery的web页面日期格式化插件
Nov 15 Javascript
jQuery之ajax删除详解
Feb 27 Javascript
jQuery向后台传入json格式数据的方法
Feb 13 Javascript
Javascript的表单验证长度
Mar 16 Javascript
原生js实现ajax方法(超简单)
Sep 20 Javascript
基于ajax与msmq技术的消息推送功能实现代码
Dec 26 Javascript
vue.js中实现登录控制的方法示例
Apr 23 Javascript
记录一次开发微信网页分享的步骤
May 07 Javascript
echarts大屏字体自适应的方法步骤
Jul 12 Javascript
Vue3 源码导读(推荐)
Oct 14 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 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
一个PHP日历程序
2006/12/06 PHP
PHP技术开发技巧分享
2010/03/23 PHP
php include加载文件两种方式效率比较
2010/08/08 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
yii用户注册表单验证实例
2015/12/26 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
js 只比较时间大小的实例
2017/10/26 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
python实现删除文件与目录的方法
2014/11/10 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
某公司部分笔试题
2013/11/05 面试题
教师自荐书
2013/10/08 职场文书
收银员岗位职责
2014/02/07 职场文书
公司租房协议书范本
2014/10/08 职场文书
旷课检讨书500字
2014/10/14 职场文书
教师师德表现自我评价
2015/03/05 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
解约证明模板
2015/06/19 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书