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 表单输入框不支持focus及blur事件的解决方案
Nov 17 Vue.js
vue + el-form 实现的多层循环表单验证
Nov 25 Vue.js
vue-router定义元信息meta操作
Dec 07 Vue.js
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 Vue.js
Vue页面渲染中key的应用实例教程
Jan 12 Vue.js
vue前端工程的搭建
Mar 31 Vue.js
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
vue中的可拖拽宽度div的实现示例
Apr 08 Vue.js
vue项目打包后路由错误的解决方法
Apr 13 Vue.js
vue项目如何打包之项目打包优化(让打包的js文件变小)
Apr 30 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
摘自织梦CMS中的图片处理类
2015/08/08 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
JavaScript 日期时间选择器一些小结
2018/04/02 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
python将ansible配置转为json格式实例代码
2017/05/15 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
Python 装饰器使用详解
2017/07/29 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
python 5个顶级异步框架推荐
2020/09/09 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
30年同学聚会邀请函
2014/01/25 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
大学生受助感言
2015/08/01 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js