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面向对象之Javascript 继承
May 04 Javascript
JQuery性能优化的几点建议
May 14 Javascript
jQuery消息提示框插件Tipso
May 04 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
Jun 23 Javascript
老司机带你解读jQuery插件开发流程
May 16 Javascript
onmouseover事件和onmouseout事件全面理解
Aug 15 Javascript
AngularJS 整理一些优化的小技巧
Aug 18 Javascript
js 索引下标之li集合绑定点击事件
Jan 12 Javascript
原生JS检测CSS3动画是否结束的方法详解
Jan 27 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 Javascript
JS回调函数深入理解
Oct 16 Javascript
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
动态实现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/03/21 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
javascript从作用域链谈闭包
2020/07/29 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
Python实现CET查分的方法
2015/03/10 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
pycharm进入时每次都是insert模式的解决方式
2021/02/05 Python
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
早餐连锁店计划书
2014/01/08 职场文书
出生公证书样本
2014/04/04 职场文书
网络技术专业求职信
2014/07/13 职场文书
个人授权委托书格式
2014/08/30 职场文书
医德考评自我评价
2014/09/14 职场文书
好媳妇事迹材料
2014/12/24 职场文书
计算机实训心得体会
2016/01/14 职场文书
使用python绘制横竖条形图
2022/04/21 Python