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-serialize()输出序列化form表单值的方法
Dec 26 Javascript
JavaScript之IE的fireEvent方法详细解析
Nov 20 Javascript
使用jquery写个更改表格行顺序的小功能
Apr 29 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
Jun 24 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
May 21 Javascript
老生常谈JavaScript 正则表达式语法
Aug 20 Javascript
Node.js读写文件之批量替换图片的实现方法
Sep 07 Javascript
JavaScript使用readAsDataURL读取图像文件
May 10 Javascript
详解vue-cli开发环境跨域问题解决方案
Jun 06 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
Sep 06 jQuery
vscode中eslint插件的配置(prettier配置无效)
Sep 10 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
Mar 17 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目录操作实例代码
2014/02/21 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
JavaScript 语言的递归编程
2010/05/18 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
python连接数据库的方法
2017/10/19 Python
python 自动去除空行的实例
2018/07/24 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
小区门卫工作职责
2013/12/14 职场文书
校园活动策划书范文
2014/01/10 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
班训口号大全
2014/06/18 职场文书
商场父亲节活动方案
2014/08/27 职场文书
2014年纪委工作总结
2014/12/05 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
红与黑读书笔记
2015/06/29 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL