el-form二次封装

ComForm.vue

<template>
  <div class="comForm">
    <el-form :label-width="formConfig.labelWidth" :inline="formConfig.inline" :ref="formConfig.ref" :model="formParams">
      <el-form-item :label="item.label" v-for="(item, index) in formData" :key="index" :prop="item.prop" :rules="item.rules" :style="{width: item.width}">
        <el-input v-if="item.type === 'input'" v-model="formParams[item.prop]" :placeholder="item.placeholder"></el-input>
        <el-select v-if="item.type === 'select'" style="width: 100%" v-model="formParams[item.prop]" :placeholder="item.placeholder">
          <el-option :label="opItem.label" :value="opItem.value" v-for="(opItem, index) in item.options" :key="index"></el-option>
        </el-select>
        <el-date-picker v-if="item.type === 'date'" type="date" style="width: 100%" v-model="formParams[item.prop]" :placeholder="item.placeholder"></el-date-picker>
        <el-radio-group v-if="item.type === 'radio'" v-model="formParams[item.prop]" :placeholder="item.placeholder">
          <el-radio :label="opItem.label" v-for="(opItem, index) in item.options" :key="index" :rules="item.rules"></el-radio>
        </el-radio-group>
        <el-input v-if="item.type === 'textarea'" type="textarea" v-model="formParams[item.prop]" :placeholder="item.placeholder"></el-input>
        <el-switch v-if="item.type === 'switch'" v-model="formParams[item.prop]"></el-switch>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm(formConfig.ref)">立即创建</el-button>
        <el-button @click="resetForm(formConfig.ref)">重置</el-button>
        </el-form-item>
    </el-form>
 </div>  
</template>

<script>
  export default {
    props: {
      formData: {
        type: Array,
        required: true,
        default: () => {
          return []
        }
      },
      formParams: {
        type: Object,
        required: true,
        default: () => {
          return {}
        }
      },
      formConfig: {
        type: Object,
        default: () => {
          return {}
        }
      }
    },
    data() {
      return {

      }
    },
    methods: {
      submitForm(formName) {
        this.$refs[formName].validate((valid) => {
          if (valid) {
            console.log(this.formParams)
          } else {
            return false;
          }
        });
      },
      resetForm(formName) {
        this.$refs[formName].resetFields()
      }
    }
  }
</script>

组件使用

<template>
  <div id="app">
    <div style="width: 700px">
      <ComForm :formData="formData" :formParams="formParams" :formConfig="formConfig"></ComForm>
    </div>
  </div>
</template>

<script>
import ComForm from './components/ComForm.vue'

export default {
  name: 'App',
  components: {
    ComForm
  },
  data() {
    return {
      areaOptions: [
        {
          label: 111,
          value: 111
        },
        {
          label: 222,
          value: 222
        }
      ],
      formData: [
        {
          type: 'input',
          label: '姓名',
          prop: 'name',
          placeholder: '请输入姓名',
          rules: [{required: true, message: '姓名不能为空', trigger: 'blur'}]
        },
        {
          type: 'input',
          label: '年龄',
          prop: 'age',
          placeholder: '请输入年龄'
        },
        {
          type: 'select',
          label: '区域',
          prop: 'area',
          options: [],
          placeholder: '请选择区域'
        },
        {
          type: 'date',
          label: '活动日期',
          prop: 'date',
          placeholder: '请选择活动日期'
        },
        {
          type: 'radio',
          label: '性别',
          prop: 'gender',
          options: [
            {
              label: '男'
            },
            {
              label: '女'
            }
          ],
          placeholder: '请选择性别',

        },
        {
          type: 'switch',
          label: '状态',
          prop: 'status',
        },
        {
          type: 'textarea',
          label: '备注',
          prop: 'remark',
          placeholder: '请输入备注',
          width: '100%'
        }
      ],
      formParams: {
        name: '',
        age: '',
        area: '',
        date: '',
        gender: '',
        remark: '',
        status: false,
      },
      formConfig: {
        labelWidth: '100px',
        inline: false,
        ref: 'formRef'
      }
      
    }
  },
  methods: {
    
  },
  watch: {
    areaOptions: {
      handler: function() {
      this.formData[2].options = this.areaOptions
      },
      immediate: true
    }
  }
}
</script>
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值