vue2+el 动态表单

这里只单纯的使用哈,复杂的可以自己在这里原基础做修改和添加,开冲吧

<template>
  <div class="top_from_select" ref="top_from_select">
    <el-form ref="form" :model="form" label-width="80px">
      <div  v-for="(item,index) in view_form_list"
            :key="index"
            class="form_item_one">
        <el-form-item :label="item.label"
                      :prop="item.key"
                      :rules="item.rules" >
          <div v-if="item.type==='Input_Text'||item.type==='Input_Password'">
            <el-input :placeholder="item.placeholder"
                      :name="item.key"
                      :show-password="item.type==='Input_Password'"
                      v-model="item.value"
                      :disabled="item.disables?true:false" ></el-input>
          </div>
          <div v-else-if="item.type==='Input_Number'">
            <el-input :placeholder="item.placeholder"
                      :name="item.key"
                      :min="item.min"
                      :max="item.max"
                      v-model="item.value"
                      :disabled="item.disables?true:false"
                      type="number"
            ></el-input>
          </div>
          <div v-else-if="item.type==='Input_Textarea'">
            <el-input :placeholder="item.placeholder"
                      :name="item.key"
                      v-model="item.value"
                      :disabled="item.disables?true:false"
                      type="textarea"
            ></el-input>
          </div>
          <div v-else-if="item.type==='Select'">
            <el-select
              v-model="item.value"
              :multiple="item.multiple"
              filterable
              allow-create
              default-first-option
              @change="update_change($event,item.key)"
              :name="item.key"
              :placeholder="item.placeholder">
              <el-option
                v-for="item_select in item.list"
                :key="item_select.value"
                :label="item_select.label"
                :value="item_select.value">
              </el-option>
            </el-select>
          </div>
          <div v-else-if="item.type==='Checkbox'">
            <el-checkbox-group
              @change="update_change($event,item.key)" :disabled="item.disables?true:false"
                               v-model="item.value">
              <el-checkbox v-for="item_checkbox in item.list"
                           :key="item_checkbox.value"
                           :label="item_checkbox.value"
                           :name="item.key">{{item_checkbox.label}}</el-checkbox>
            </el-checkbox-group>
          </div>
          <div v-else-if="item.type==='Radio'">
            <el-radio-group
              @change="update_change($event,item.key)" :disabled="item.disables?true:false"
                               v-model="item.value">
              <el-radio v-for="item_checkbox in item.list"
                           :key="item_checkbox.value"
                           :label="item_checkbox.value"
                           :name="item.key">{{item_checkbox.label}}</el-radio>
            </el-radio-group>
          </div>

          <div v-else-if="item.type==='TimePicker'
                        ||item.type==='DatePicker'
                        ||item.type==='DateTimePicker'
                        ||item.type==='DatesPicker'
                        ||item.type==='WeekPicker'
                        ||item.type==='MonthPicker'
                        ||item.type==='YearPicker'
                        ||item.type==='TimePicker_end'
                        ||item.type==='DatePicker_end'
                        ||item.type==='MonthPicker_end'
                        ||item.type==='DateTimePicker_end'
">
            <el-time-select
              v-if="item.type==='TimePicker'"
              @change="update_change($event,item.key)"
              v-model="item.value"
              :name="item.key"
              :picker-options="{ start: '08:30',step: '00:15',end: '18:30'}"
              :placeholder="item.placeholder">
            </el-time-select>
            <el-date-picker
              v-if="item.type==='DatePicker'
              ||item.type==='DatesPicker'
              ||item.type==='WeekPicker'
              ||item.type==='MonthPicker'
              ||item.type==='YearPicker'"
              @change="update_change($event,item.key)"
              v-model="item.value"
              :name="item.key"
              :type="(item.type.substring(0,item.type.indexOf('Picke'))).toLowerCase()"
              :placeholder="item.placeholder">
            </el-date-picker>
            <el-date-picker
              v-if="item.type==='DateTimePicker'"
              @change="update_change($event,item.key)"
              v-model="item.value"
              type="datetime"
              :name="item.key"
              :placeholder="item.placeholder"
              align="right"
              :picker-options="pickerOptions">
            </el-date-picker>
            <el-time-picker
              v-if="item.type==='TimePicker_end'"
              is-range
              @change="update_change($event,item.key)"
              v-model="item.value"
              :name="item.key"
              range-separator="-"
              start-placeholder="开始时间"
              end-placeholder="结束时间"
              :placeholder="item.placeholder">
            </el-time-picker>
            <el-date-picker
              v-if="item.type==='DatePicker_end'
              ||item.type==='DatesPicker_end'
              ||item.type==='MonthPicker_end'
              ||item.type==='DateTimePicker_end'"
              :type="(item.type.substring(0,item.type.indexOf('Picke'))).toLowerCase()+'range'"
              @change="update_change($event,item.key)"
              v-model="item.value"
              :name="item.key"
              range-separator="-"
              start-placeholder="开始时间"
              end-placeholder="结束时间"
              :placeholder="item.placeholder">
            </el-date-picker>
          </div>

        </el-form-item>
      </div>
      <el-form-item class="submit_item">
        <div>
          <el-button v-if="reset" @click="resetForm('form')">重置</el-button>
          <el-button class="submit_class" type="primary" @click="submitForm('form')">查询</el-button>
        </div>

      </el-form-item>
    </el-form>
  </div>
</template>

<script>
  /**
   *配置信息
   *
   **/
  export default {
    name: "top_from_select",
    props: {
      //列表数据
      form_list: {
        type: [Array],
        default: {
          return: [],
        }
      },
      //是否显示重置按钮
      reset:{
        type: [Boolean],
        default: {
          return: false,
        }
      },

    },
    data() {
      return {
        dom_width: 0,//元素的宽度
        view_form_list:[],
        form: {},//表单绑定对象
        //日期时间快捷键
        pickerOptions: {
          shortcuts: [{
            text: '今天',
            onClick(picker) {
              picker.$emit('pick', new Date());
            }
          }, {
            text: '昨天',
            onClick(picker) {
              const date = new Date();
              date.setTime(date.getTime() - 3600 * 1000 * 24);
              picker.$emit('pick', date);
            }
          }, {
            text: '一周前',
            onClick(picker) {
              const date = new Date();
              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit('pick', date);
            }
          }]
        }
      }
    },
    watch:{
      //监听列表变化
      form_list(new_val,old_val){
        this.mounted_view_update(new_val);
        this.view_form_list=new_val;
      },

    },
    created() {
      this.mounted_view_update(this.form_list);
      this.view_form_list=this.form_list;
    },
    mounted() {
      var that = this;
      this.$nextTick(() => {
        that.dom_width = that.$refs.top_from_select.offsetWidth;
        //监听输入框的数据变化
        that.$refs.top_from_select.addEventListener('change',function(e){
          that.mounted_view_update(that.view_form_list);
        })
      })
    },
    methods:{
      mounted_view_update(data){
        data.forEach((item,index)=>{
          if(item.type==='InputNumber'){//处理数值的大小限制(注意:这里主要是输入框number的bug失去焦点的时候没有恢复到最小最大值)
            var number_val=parseInt(item.value)>parseInt(item.max)?item.max:parseInt(item.value)<parseInt(item.min)?item.min:item.value;
            this.$set(this.form,item.key,number_val);
            if(this.view_form_list&&this.view_form_list.length>0){
              this.$set(this.view_form_list[index],'value',number_val);
            }
          }else{
            this.$set(this.form,item.key,item.value);
          }
        })
      },
      update_change(val,key){
        this.$set(this.form,key,val);
      },
      submitForm(formName) {
        var that=this;
        this.$refs[formName].validate((valid) => {
          if (valid) {
            that.$emit('submit',that.form);
          } else {
            return false;
          }
        });
      },
      resetForm(formName) {
        this.$refs[formName].resetFields();
      }
    }
  }
</script>

<style scoped lang="scss">
  .top_from_select {
    height: 100%;
    overflow-y: auto;
    padding-right: 150px;
    position: relative;
    .form_item_one {
      vertical-align:top;
      display: inline-block;
      padding-right: 20px;
    }
  }
  /deep/ input[type="number" i] {
    padding: 1px 2px !important;
  }
  /deep/ .el-textarea__inner{
    max-height: 300px !important;
    height: 33px !important;
  }
  /deep/ .el-form-item__label{
    text-align: left !important;
    height: 35px !important;
    line-height: 35px !important;
  }
  /deep/ .el-form-item__content{
    height: 35px !important;
    line-height: 35px !important;
  }
  .submit_item{
    position: absolute;
    right: 0px;
    top: 0px;
    text-align: right;
  }
  /deep/ .el-input__inner{
    height: 33px !important;
    line-height: 33px;
  }
  .submit_class{
    padding: 8px 20px;
  }
</style>

组件使用

 <top_from_select @submit="select_from" :reset="false" :form_list="select_form_list" ></top_from_select>

这里大概数据结构和类型表单验证可以去el看一下使用方式

 select_form_list:[
              {
                type:"Input_Text",//正常输入框 Input_Text 或者 Input_Password 密码框
                key:"input_box",
                label:"输入内容",
                disables:false,
                placeholder:"请输入",
                value:"我有个默认值",
                rules:[{
                  required:true,//是否开启非空验证
                  message:"请输入内容",//非空提示内容
                  trigger:'blur',
                }]
              },
              {
                type:"Input_Number",//输入数字的
                key:"InputNumber",//返回内容
                label:"输入数字",//标签
                disables:false,
                placeholder:"请输入",
                value:"0",//默认值
                min:"0",//最小值
                max:"100",//最大值
                rules:[
                  {
                  required:true,//是否开启非空验证
                  message:"请输入值",//非空提示内容
                  trigger:'blur',
                  }
                ]
              },
              {
                type:"Input_Textarea",//输入数字的
                key:"Input_Textarea",//返回内容
                label:"输入数字",//标签
                disables:false,
                placeholder:"请输入",
                value:"0",//默认值
                min:"0",//最小值
                max:"100",//最大值
                rules:[
                  {
                    required:true,//是否开启非空验证
                    message:"请输入值",//非空提示内容
                    trigger:'blur',
                  }
                ]
              },
              {
                type:"Select",//输入数字的默认单选
                key:"Select",//返回内容
                label:"输入数字",//标签
                disables:false,
                placeholder:"请选择",
                multiple:false,//是否多选
                list:[
                  {
                    value: 'HTML1',
                    label: 'HTML11111'
                  },
                  {
                    value: 'HTML2',
                    label: 'HTML2222'
                  },
                ],
                value:'',//Select默认值设为数组 开启多选[],单选""空字符串
                rules:[{
                  required:true,//是否开启非空验证
                  message:"请选择内容",//非空提示内容
                  trigger:'blur',
                }]
              },
              {
                type:"Checkbox",//多选
                key:"Checkbox",//返回内容
                label:"请选择",//标签
                disables:false,
                value:[],//默认选择值多选都为[],
                list:[
                  {
                    value: 'HTML1',
                    label: 'HTML11111'
                  },
                  {
                    value: 'HTML2',
                    label: 'HTML2222'
                  },
                ],//列表数据
                rules:[{
                  required:true,//是否开启非空验证
                  message:"请选择内容",//非空提示内容
                  trigger:'blur',
                }]
              },
              {
                type:"Radio",//多选
                key:"Radio",//返回内容
                label:"请选择",//标签
                disables:false,
                value:'',//默认选择值,
                list:[
                  {
                    value: 'HTML1',
                    label: 'HTML11111'
                  },
                  {
                    value: 'HTML2',
                    label: 'HTML2222'
                  },
                ],//列表数据
                rules:[{
                  required:true,//是否开启非空验证
                  message:"请选择内容",//非空提示内容
                  trigger:'blur',
                }]
              },
              {
                type:"DateTimePicker_end",
                //TimePicker//时间,
                // DatePicker,//日期
                // DatesPicker,//多个日期
                // WeekPicker,//周
                // MonthPicker,//月份
                // YearPicker,//年份
                // DateTimePicker
                // 日期时间选择器,
                // 后缀加上_end显示开始和结束选择 周和年不可用(如:DateTimePicker_end)
                key:"TimePicker",//返回内容
                label:"时间控件",//标签
                disables:false,
                placeholder:"请选择时间",
                value:'',//默认选择值,
                rules:[{
                  required:true,//是否开启非空验证
                  message:"请选择时间",//非空提示内容
                  trigger:'blur',
                }]
              }
            ]

查询回调触发,改请求接口就请求,做自己业务逻辑哈

  select_from(data){
     console.log(data);
   }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue Element的动态表单是一种可以动态设置表单项并渲染出来的表单组件。通常情况下,我们需要使用Vue Element的el-formel-form-item构建表单,但是使用动态表单可以快速简便地创建表单。它不仅减少了代码的重复,还可以根据不同的需求灵活地增加和删除表单项。 首先,我们需要定义一个数组来存储表单项。数组中的每一个项都是一个对象,对象包含了表单项的各种属性,如类型,名称,placeholder等。在组件中,我们需要对这个数组进行遍历,并根据每一个对象的属性来动态地渲染出表单项。 其次,我们需要使用Vue Element的组件绑定来动态地设置表单项的属性,比如v-model可以用来绑定表单项的,v-if可以用来控制表单项的显隐性,v-for可以用来循环遍历表单项。 在表单项的定义过程中,我们可以使用计算属性来对表单项的属性进行动态计算,从而实现表单项的复杂计算和逻辑处理。 最后,我们需要添加一个动态增加表单项的方法或组件。通常情况下,我们可以添加一个按钮或者下拉选择框,在用户进行相应的操作后,根据选择或者用户输入的数据来动态地增加表单项。 总的来说,Vue Element的动态表单可以根据不同的需求快速地创建表单,并且可以灵活地增加和删除表单项。使用动态表单可以大大减少代码的重复,提高开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值