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项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
全面解析Vue中的$nextTick
Dec 24 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
vue-element-admin项目导入和导出的实现
May 21 Vue.js
vue+echarts实现多条折线图
Mar 21 Vue.js
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 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
浅析php中jsonp的跨域实例
2013/06/21 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
2019/06/27 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
PyCharm GUI界面开发和exe文件生成的实现
2020/03/04 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
Shein英国:女性时尚网上商店
2019/04/10 全球购物
大门门卫岗位职责
2013/11/30 职场文书
疾病捐款倡议书
2014/05/13 职场文书
成本会计实训报告
2014/11/05 职场文书
安全员岗位职责范本
2015/04/11 职场文书
银行培训心得体会范文
2016/01/09 职场文书
学习心得体会
2019/06/20 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
MongoDB支持的索引类型
2022/04/11 MongoDB