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新手入门指导教程
Nov 18 Vue.js
Vue用mixin合并重复代码的实现
Nov 27 Vue.js
如何实现vue的tree组件
Dec 03 Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
vue 动态添加的路由页面刷新时失效的原因及解决方案
Feb 26 Vue.js
vue3使用vue-router的完整步骤记录
Jun 20 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
vue3中provide && inject的使用
Jul 01 Vue.js
Vue中Object.assign清空数据报错的解决方案
Mar 03 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爆绝对路径方法收集整理
2012/09/17 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
php实现微信发红包功能
2018/07/13 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
jQuery多项选项卡的实现思路附样式及代码
2014/06/03 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
深入理解React高阶组件
2017/09/28 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
Python文件和流(实例讲解)
2017/09/12 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
大学生收银员求职信分享
2014/01/02 职场文书
后进生转化工作制度
2014/01/17 职场文书
玲玲的画教学反思
2014/02/04 职场文书
师德师风承诺书
2014/05/23 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
JS实现九宫格拼图游戏
2022/06/28 Javascript