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 相关文章推荐
基于jQuery的history历史记录插件
Dec 11 Javascript
javascript中onmouse事件在div中失效问题的解决方法
Jan 09 Javascript
javascript实现页面内关键词高亮显示代码
Apr 03 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
Aug 05 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
Dec 14 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
Feb 17 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
Nov 30 Javascript
浅谈Node.js:Buffer模块
Dec 05 Javascript
ES6入门教程之Class和Module详解
May 17 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
Oct 27 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 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中使用unset销毁变量并内存释放问题
2012/07/05 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
复制粘贴功能的Python程序
2008/04/04 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
Python常用知识点汇总
2016/05/08 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
浅谈Python中的bs4基础
2018/10/21 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
Camper鞋西班牙官方网上商店:西班牙马略卡岛的鞋类品牌
2019/03/14 全球购物
NBA欧洲商店(西班牙):NBA Europe Store ES
2019/04/16 全球购物
建筑自我鉴定
2013/10/19 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
情人节活动总结范文
2015/02/05 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
python实现高效的遗传算法
2021/04/07 Python
MySQL导致索引失效的几种情况
2022/06/25 MySQL
Nginx报404错误的详细解决方法
2022/07/23 Servers