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 相关文章推荐
ExtJS4如何给同一个formpanel不同的url
May 02 Javascript
PHP PDO操作总结
Nov 17 Javascript
JS实现文字放大效果的方法
Mar 03 Javascript
jQuery随机密码生成的方法
Mar 09 Javascript
jQuery插件Validate实现自定义校验结果样式
Jan 18 Javascript
js实现带农历和八字等信息的日历特效
May 16 Javascript
分享javascript实现的冒泡排序代码并优化
Jun 05 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
Feb 02 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
Sep 26 Javascript
JS简单添加元素新节点的方法示例
Feb 10 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
Aug 27 Javascript
手机浏览器唤起微信分享(JS)
Oct 11 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
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
php实现的xml操作类
2016/01/15 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
2016/11/30 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
基于postman获取动态数据过程详解
2020/09/08 Javascript
Python的条件语句与运算符优先级详解
2015/10/13 Python
Python中GIL的使用详解
2018/10/03 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
pandas的qcut()方法详解
2019/07/06 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
中专自荐信
2013/10/13 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
青春无悔演讲稿
2014/05/08 职场文书
酒店节能减排方案
2014/05/26 职场文书
护士实习求职信
2014/06/22 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
Redis持久化与主从复制的实践
2021/04/27 Redis