vue+elementui通用弹窗的实现(新增+编辑)


Posted in Vue.js onJanuary 07, 2021

本文主要介绍了vue+elementui通用弹窗的实现(新增+编辑),分享给大家,具体如下:

vue+elementui通用弹窗的实现(新增+编辑)

组件模板

<el-dialog :title="title" :visible.sync="dialogShow" :close-on-click-modal="false">
  <div class="ym-common-dialog" :class="customClass">
    <div v-for="(col,index) in cols">
      <span><em v-if="!!col.isRequire">*</em>{{col.name}}</span>
      <template v-if="col.type === 'text'">
        <div>{{submitData[col.key]}}</div>
      </template>
      <template v-if="col.type === 'input'">
        <input type="text" v-model="submitData[col.key]" :placeholder="'请输入' + col.name">
      </template>
      <template v-if="col.type === 'radio'">
        <div class="flexX">
        <el-radio v-for="radio in col.data" v-model="submitData[col.key]" :label="radio.label">{{radio.name}}</el-radio>
        </div>
      </template>
      <template v-if="col.type === 'select'">
        <el-select v-model="submitData[col.key]" placeholder="请选择">
          <el-option
          v-for="option in col.data"
          :key="option.value"
          :label="option.label"
          :value="option.value">
          </el-option>
        </el-select>
      </template>
    </div>
  </div>
  <span slot="footer" class="dialog-footer">
    <el-button @click="dialogShow = false">取 消</el-button>
    <el-button type="primary" @click="confirm">确 定</el-button>
  </span>
</el-dialog>

弹窗的内容根据传入的数据去渲染,数据格式如下

cols: [{
  name: '输入框',
  key: 'ccc', // 提交时对应的字段
  type: 'input', // 类型 
  isRequire: true // 是否必填
}, {
  name: '单选框',
  key: 'aaa',
  type: 'radio',
  data: [{
    label: '1',
    name: '长城'
  }, {
    label: '2',
    name: '长安'
  }],
  isRequire: true
}, {
  name: '下拉框',
  key: 'bbb',
  type: 'select',
  data: [{
    value: '选项1',
    label: '黄金糕'
  }, {
    value: '选项2',
    label: '双皮奶'
  }],
  isRequire: true
}],

组件data和props

data() {
  return {
    submitData: {}, // 提交数据集合
    dialogShow: false
  }
},
props: {
  // 弹窗显示/隐藏
  dialogVisible: {
    type: Number,
    default: 0
  },
  // 弹窗Title
  title: String,
  // 自定义样式
  customClass: String,
  // 数据列
  cols: {
    type: Array,
    default: () => []
  },
  // 编辑时传入初始值
  data: {
    type: Object,
    default: () => {}
  }
},

组件数据的监听

watch: {
  dialogVisible(val) {
    if (val > 0) {
      this.dialogShow = true
    }
  },
  data: {
    handler(val) {
      this.submitData = val
    },
    immediate: true
  },
  submitData: {
    // 应对 切换单选框隐藏其他元素的问题
    // 父组件监听到单选框的值变化时,修改cols的值,即可实现元素的隐藏与显示
    handler() {
      this.$emit('change', this.submitData)
    },
    deep: true
  }
}

数据提交以及验证

confirm() {
  // 验证必填项
  let isMust = this.cols.filter(item => item.isRequire).map(item => item.key)
  Object.keys(this.submitData).forEach(key => {
    let index = isMust.indexOf(key)
    if ((index > -1) && this.submitData[key] !== '' && !!this.submitData[key]) {
      isMust.splice(index, 1)
    }
  })
  if (isMust.length > 0) {
    showDefaultTips('请注意必填项!', '', 3)
    return
  }
  this.$emit('complete', this.submitData)
  this.dialogShow = false
}

代码在此

到此这篇关于vue+elementui通用弹窗的实现(新增+编辑)的文章就介绍到这了,更多相关vue elementui 弹窗内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
Vuex实现简单购物车
Jan 10 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 Vue.js
Vue实现圆环进度条的示例
Feb 06 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
详解Vue的列表渲染
Nov 20 Vue.js
vue ref如何获取子组件属性值
Mar 31 Vue.js
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
VUE递归树形实现多级列表
Jul 15 Vue.js
详解Vue2的diff算法
Jan 06 #Vue.js
vuex的使用步骤
Jan 06 #Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 #Vue.js
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 #Vue.js
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 #Vue.js
jenkins自动构建发布vue项目的方法步骤
Jan 04 #Vue.js
vue3弹出层V3Popup实例详解
Jan 04 #Vue.js
You might like
推荐几部必看的DC动画电影
2020/03/03 欧美动漫
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
一周学会PHP(视频)Http下载
2006/12/12 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
关于 angularJS的一些用法
2017/11/29 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
2018/08/30 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
深入了解Django中间件及其方法
2019/07/26 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
html5菜单折纸效果
2014/04/22 HTML / CSS
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
贺卡寄语大全
2014/04/11 职场文书
校长竞聘演讲稿
2014/05/16 职场文书
2014年实习生工作总结
2014/11/27 职场文书
工作感言一句话
2015/08/01 职场文书
关于远足的感想
2015/08/10 职场文书