vue2 动态表单组件

动态表单 可以让我们 高效的开发 ,避免代码冗余,通过数据来进行页面表单元素的渲染

这里我只列举了 开发常用的表单元素 如果不满足开发需求 可自行添加

<template>
  <div>
    <el-form :model="formData" ref="FormItems_rules" :inline='true' :rules="rules" label-width="auto" class="demo-ruleForm">
      <el-form-item v-for="(item,index) in formItems" :key="index" :label="item.label+':'" :prop="item.model">
        <el-input v-if="item.type == 'ipt'" 
        :placeholder="'请填写'+item.label" 
        v-model="formData[item.model]" 
        style="width: 380px;"></el-input>

        <el-input v-if="item.type == 'textarea'" 
        :placeholder="'请填写'+item.label" 
        type="textarea" 
        v-model="formData[item.model]" 
        style="width: 380px;"></el-input>

        <el-select v-else-if="item.type == 'select'" 
        :placeholder="'请选择'+item.label" 
        v-model="formData[item.model]" 
        @change="item.func ? onAction(formData[item.model]) : ''"
        style="width: 380px;">
          <el-option v-for="(it,index) in item.opts" :key="index" :label="it.label" :value="it.value"></el-option>
        </el-select>

        <el-switch 
        v-else-if="item.type == 'switch'" 
        v-model="formData[item.model]" 
        style="width: 380px;"></el-switch>

        <el-radio-group 
        v-else-if="item.type == 'radio'" 
        v-model="formData[item.model]">
          <el-radio v-for="(it,index) in item.opts" :key="index" :label="it.value">{{it.label}}</el-radio>
        </el-radio-group>

        <el-checkbox-group 
        v-else-if="item.type == 'checkbox'" 
        v-model="formData[item.model]">
          <el-checkbox v-for="(it,index) in item.opts" :key="index" :label="it.value" :name='item.name'>{{it.label}}</el-checkbox>
        </el-checkbox-group>

        <el-date-picker v-else-if="item.type == 'date'"  
        :start-placeholder="item.pickerDate.type == 'daterange'?'开始日期':''" 
        :end-placeholder="item.pickerDate.type == 'daterange'?'结束日期':''" 
        :value-format='item.pickerDate.formatValue' 
        v-model="formData[item.model]" 
        :type="item.pickerDate.type" 
        placeholder="选择日期">
        </el-date-picker>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  props: {
    formItems: Array,
    form_Data: Object,
    rules: Object,
  },
  data() {
    return {
      formData: {},
    }
  },
  methods:{
    onAction(val){
        console.log(val);
    }
  },
  created() {
    this.formData = this.form_Data
  },
}
</script>

<style>
</style>

<FormItems :formItems='formItems' :rules='rules'  ref='FormItems' :form_Data='form_Data'></FormItems>

 组件需要传递的属性说明

formItems Array 

formItems: [
        {
          label: '省份名称',
          type: 'ipt',
          model: 'cityName'
        },
        {
          label: '选择时间',
          type: 'date',
          model: 'time1',
          pickerDate: {
            type: 'date',
            formatValue: 'yyyy-MM-dd'
          },
        },
        {
          label: '选择城市',
          type: 'select',
          model: 'city',
          func:true,
          opts: [
            {
              label: '哈尔滨',
              value: '1'
            },
            {
              label: '齐齐哈尔',
              value: '2'
            },
            {
              label: '牡丹江',
              value: '3'
            },
            {
              label: '佳木斯',
              value: '4'
            },
          ]
        },
        {
          label: '喜欢的运动',
          type: 'checkbox',
          model: 'sports',
          opts: [
            {
              label: '篮球',
              value: '1',
              name: 'ball'
            },
            {
              label: '羽毛球',
              value: '2',
              name: 'ball'
            },
            {
              label: '足球',
              value: '3',
              name: 'ball'
            },
          ]
        },
      ],

label 元素名称

type 元素类型

model 双向绑定的值

对于选择时间的表单元素

         pickerDate 

                type 表单类型

                formatValue 获得的时间格式

对于 select checkbox radio

        opts 

                存储的是每一项的值和名称

 form_Data Object

       存储的是 你要双向绑定的值 必须写 不能传空对象 否则会报错

 rules Object 

        表单校验规则

rules: {
        cityName: [
          { required: true, message: '请输入cityName', trigger: 'blur' }
        ],
      }

注意 调用.validate 需要调用子组件中表单的ref的.validate方法 

 this.$refs.FormItems.$refs.FormItems_rules.validate((valid) => {
        console.log(valid);
      })

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vue3 动态表单组件的设计思路可以分为以下几个步骤: 1. 定义数据结构:首先确定表单需要收集的数据类型和字段,比如文本输入、下拉选择、单选、多选等等。可以使用对象或数组的方式来表示表单的数据结构,并为每个字段指定相应的属性(例如字段名称、类型、默认值、选项等)。 2. 构建表单组件:创建一个包含所有表单字段的组件,并根据数据结构动态生成表单元素。可以使用`v-for`指令循环渲染表单字段,并根据字段类型选择合适的表单元素组件进行渲染。 3. 实现数据绑定:为每个表单元素添加相应的`v-model`指令,将用户输入的值与表单组件的数据进行双向绑定。这样可以实时更新表单组件中的数据,并且用户输入的值也会反映在相应的表单字段上。 4. 处理提交事件:在表单组件中添加一个提交按钮或者监听表单的提交事件,在用户点击提交按钮或者提交表单时,通过方法或事件处理函数收集表单数据并进行相应的处理,比如发送给后端进行保存或进一步处理。 5. 提供扩展性:考虑到动态表单可能会有不同的需求,可以通过添加插槽或者额外的属性来提供扩展性。比如可以为表单组件添加一个插槽,用于自定义表单的布局或者添加额外的表单字段。 通过以上的设计思路,可以实现一个灵活、可复用的动态表单组件,使表单的设计和渲染更加简洁和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值