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 相关文章推荐
破除网页鼠标右键被禁用的绝招大全
Dec 27 Javascript
jQuery中has()方法用法实例
Jan 06 Javascript
javascript中$(function() {});写与不写有哪些区别
Aug 10 Javascript
第二篇Bootstrap起步
Jun 21 Javascript
react-native中ListView组件点击跳转的方法示例
Sep 30 Javascript
微信小程序简单实现form表单获取输入数据功能示例
Nov 30 Javascript
Vue中v-for的数据分组实例
Mar 07 Javascript
深入了解query和params的使用区别
Jun 24 Javascript
微信小程序 select 下拉框组件功能
Sep 09 Javascript
详解Vue 项目中的几个实用组件(ts)
Oct 29 Javascript
Vue 打包体积优化方案小结
May 20 Javascript
vue el-upload上传文件的示例代码
Dec 21 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读取目录所有文件信息dir示例
2014/03/18 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
Vue中props的使用详解
2018/06/15 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
python先序遍历二叉树问题
2017/11/10 Python
Python实现的计数排序算法示例
2017/11/29 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
毕业生自我鉴定
2013/12/04 职场文书
青年文明号事迹材料
2014/01/18 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
oracle索引总结
2021/09/25 Oracle
Python与C++中梯度方向直方图的实现
2022/03/17 Python