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 getElementsByName()的用法说明
Jul 31 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
Aug 02 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
Mar 18 Javascript
简单纯js实现点击切换TAB标签实例
Aug 23 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
AngularJS执行流程详解
Feb 17 Javascript
angular 服务随记小结
May 06 Javascript
用js简单提供增删改查接口
May 12 Javascript
Node.js实现批量下载图片简单操作示例
Jan 18 Javascript
原生js实现轮播图特效
May 04 Javascript
Vue实现随机验证码功能
Dec 29 Vue.js
React中的Context应用场景分析
Jun 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
php把大写命名转换成下划线分割命名
2015/04/27 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
JS获取本地地址及天气的方法实例小结
2019/05/10 Javascript
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
Python Flask基础教程示例代码
2018/02/07 Python
django框架自定义用户表操作示例
2018/08/07 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
Python操作qml对象过程详解
2019/09/26 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python库安装速度过慢解决方案
2020/07/14 Python
python opencv实现图像配准与比较
2021/02/09 Python
利用CSS3实现进度条的两种姿势详解
2017/03/21 HTML / CSS
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
Mountain Hardwear官网:攀岩服装和户外装备
2019/09/26 全球购物
面试后感谢信
2014/02/01 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
学习保证书
2015/01/17 职场文书
人事局接收函
2015/01/31 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技