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

本文主要介绍了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
}

代码在此

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容