动态表单生成Demo(Vue+elment)

news2024/9/22 19:42:40

摘要:本文将介绍如何使用vue和elment ui组件库实现一个简单的动态表单生成的Demo。主要涉及两个.vue文件的书写,一个是动态表单生成的组件文件,一个是使用该动态表单生成的组件。

1.动态表单生成组件

这里仅集成了输入框、选择框、日期框三种类型的表单项;

其他类型的表单元素,比如单选框、复选框等,也可以根据需要进行类似的处理。

可以动态计算每一行放置的表单数。

<template>
  <div>
    <el-form :model="data" :rules="rules" :label-width="labelWidth" :disabled="formDisabled">
      <el-row :gutter="10" style="display: flex; flex-wrap: wrap">
        <template v-for="(field, index) in formFields">
          <el-col :key="index" :span="calculateSpanSize(field)">
            <el-form-item
              :prop="field.name"
              :label="field.label"
              :rules="field.rules"
              :require="field.require ? field.required() : false"
              v-bind="field.bind"
            >
              <el-input
                v-if="field.type === 'text'"
                :type="field.type"
                :id="field.name"
                :name="field.name"
                v-model="data[field.name]"
                :style="{ width: field.width || '100%' }"
              />
              <el-select
                v-else-if="field.type === 'select'"
                :id="field.name"
                v-model="data[field.name]"
                :style="{ width: field.width || '100%' }"
              >
                <el-option
                  v-for="(option, optionIndex) in field.options"
                  :key="optionIndex"
                  :value="option.value"
                  :label="option.label"
                  :style="{ width: field.width || '100%' }"
                >
                  {{ option.label }}
                </el-option>
              </el-select>
              <el-date-picker
                v-else-if="field.type === 'date'"
                v-model="data[field.name]"
                :type="field.type"
                placeholder="选择日期"
                :style="{ width: field.width || '100%' }"
              >
              </el-date-picker>
            </el-form-item>
          </el-col>
          <!-- 其他类型的表单元素,比如单选框、复选框等,也可以根据需要进行类似的处理 -->
        </template>
      </el-row>
      <el-row><el-button type="success" @click="submitForm">提交</el-button></el-row>
    </el-form>
  </div>
</template>

<script>
export default {
  name: 'MyFrom',
  props: {
    labelWidth: {
      type: String,
      default: '100px'
    },
    rules: {
      type: Object,
      default: () => {}
    },
    formFields: {
      type: Array,
      default: () => []
    },
    data: {
      type: Object,
      default: () => {}
    },
    spanSize: {
      type: Number,
      default: 2,
      validator: value => {
        return value <= 5
      }
    },
    disabled: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {}
  },
  created() {},
  computed: {
    formDisabled() {
      return typeof disabled === 'function' ? this.disabled() : this.disabled
    }
  },
  methods: {
    submitForm() {
      // 处理表单提交逻辑
      console.log('Form Data:', this.data)
      this.$parent.submintData(this.data)
    },
    calculateSpanSize(item) {
      const span = item.span || 1
      const spanTemp = (24 / this.spanSize) * span
      return spanTemp > 24 ? 24 : spanTemp
    }
  }
}
</script>

2.使用动态表单的父组件

1.引入动态表单生成组件

2.对表单的属性进行配置

3.点击按钮调用父组件的提交数据函数,打印表单提交数据,看数据是否绑定成功

<template>
  <div style="width: 800px">
    <my-form :form-fields="formFields" :data="formData" :span-size="2"></my-form>
  </div>
</template>

<script>
import MyForm from './MyForm.vue'

const defaultFormData = {
  name: '',
  gender: '',
  birthday: '',
  enabled: true,
  address: '',
  id: ''
}

export default {
  name: 'HelloWorld',
  components: { MyForm },
  props: {
    msg: String
  },
  data() {
    return {
      isEdit: false,
      visible: false,
      formFields: [
        {
          type: 'text',
          label: '姓名',
          name: 'name',
          rules: [{ required: true, trigger: 'blur', message: '请输入姓名' }],
        },
        {
          type: 'select',
          label: '性别',
          name: 'gender',
          options: [
            { label: '男', value: '1' },
            { label: '女', value: '0' }
          ]
        },
        { type: 'date', label: '生日', name: 'birthday' },
        {
          type: 'text',
          label: '家庭地址',
          name: 'address',
          rules: [{ required: true, trigger: 'blur', message: '请输入家庭地址' }],
        }
        // 可根据需要添加更多的表单字段
      ],
      formData: Object.assign({}, defaultFormData)
    }
  },
  methods: {
    submintData() {
      console.log('11111' + JSON.stringify(this.formData))
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss">
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

提交结果:

3.思考

1.在设计动态表单生成组件时,可以使用component标签改进,而不是为每一种类型的表单项都写一个if判断,毕竟表单项类型比较多;后期会对这个点进行改进;

2.提交按钮可以放到父组件,动态表单生成组件就只负责生成表单以及绑定数据等逻辑的操作。

3.当你在一个 el-row 中包含多个 el-col(列)时,你可以使用 gutter 属性来设置列之间的空隙,以增加页面的可读性和美观度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1152910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebAssembly完全入门——了解wasm的前世今身

前言 接触WebAssembly之后&#xff0c;在google上看了很多资料。感觉对WebAssembly的使用、介绍、意义都说的比较模糊和笼统。感觉看了之后收获没有达到预期&#xff0c;要么是文章中的例子自己去实操不能成功&#xff0c;要么就是不知所云、一脸蒙蔽。本着业务催生技术的态度&…

Linux 环境下 安装 Elasticsearch 7.13.2

Linux 环境下 安装 Elasticsearch 7.13.2 前言镜像下载&#xff08;国内镜像地址&#xff09;解压安装包修改配置文件用 Es 自带Jdk 运行配置 Es 可被远程访问然后启动接着启动本地测试一下能不能连 Es 前言 借公司的 centos 7 服务器&#xff0c;搭建一个 Es&#xff0c;正好熟…

8.3 矢量图层点要素单一符号使用五

文章目录 前言单一符号&#xff08;Single symbol&#xff09;渲染几何生成器&#xff08;Geometry generator&#xff09;QGis代码实现 总结 前言 上一篇教程介绍了矢量图层点要素单一符号中填充标记的用法本章继续介绍单一符号中各种标记的用法说明&#xff1a;文章中的示例…

AR的光学原理?

AR智能眼镜的光学成像系统 AR眼镜的光学成像系统由微型显示屏和光学镜片组成&#xff0c;可以将其理解为智能手机的屏幕。 增强现实&#xff0c;从本质上说&#xff0c;是将设备生成的影像与现实世界进行叠加融合。这种技术基本就是通过光学镜片组件对微型显示屏幕发出的光线…

java项目之中学校园网站(ssm框架)

项目简介 中学校园网站实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、教师管理、学生管理、校园概况管理、名师风采管理、校园公告管理、试卷管理、试题管理、校园论坛、系统管理、考试管理。教师&#xff1a;个人中心、校园概况管理、名师风采管理、校园公告管理…

PM866 3BSE050200R1 L003748-AR 3BSX108237R300

PM866 3BSE050200R1 L003748-AR 3BSX108237R300 工业自动化制造商和工业物联网工具开发商Opto 22宣布推出新版groov&#xff0c;将IIoT technologies MQTT和OPC-UA驱动程序直接嵌入其工业边缘设备。新版本添加到用于web和移动可视化的groov View软件以及开源的Node-RED开发环境…

第三方支付预付卡业务详解

第三方支付预付卡业务详解 第三方支付预付卡业务是指由第三方支付公司提供的一种预先充值后消费的支付方式。用户可以在第三方支付平台上购买预付卡&#xff0c;然后在指定的商户或者服务提供商那里进行消费。 运作模式&#xff1a; 1. 用户在第三方支付平台购买预付卡&#xf…

Django项目单字段的区间查询

在Django项目中会碰到一些需求就是查询某个表中的一些字段从某日到某日的数据&#xff0c;而且是对但字段查询这个时候我们有两两种方法解决 单字段类型是DateTimeField的 查询日期范围的 这个时候在filter.py里面重写DateTimeFromToRangeFilter&#xff0c;为什么要重写呢&am…

kubernetes部署(web界面)

基本队对象 pod 最小单位 service 跟网络相关 Volume Namespace 准备工作&#xff1a; master node1 node2 修改主机名&#xff1a; 做本地解析 10.0.0.51 master 10.0.0.56 node-1 10.0.0.186 node-2 关闭swap分区&#xff1a; swapoff -a  临时关闭 …

双点双向重发布解决方案

某公司有两张园区网络&#xff0c;分别是A园区和B园区&#xff0c;由于业务需求&#xff0c;需要将两张园区网络整合到一起&#xff0c;实现互联互通。 因此管理员将AR2-AR4、AR3-AR5通过物理线缆相连&#xff0c;并且此互联链路运行在ospf 100中。 现在要求工程师在AR2和AR3…

AD教程(三)IC类元件模型的创建

AD教程&#xff08;三&#xff09;IC类元件模型的创建 IC类元件 IC芯片&#xff08;Intergrated Circuit Chip&#xff09;是将大量的微电子元器件&#xff08;晶体管、电阻、电容等&#xff09;形成的集成电路放在一块塑基上&#xff0c;做成一块芯片。 IC类元件的创建 新…

JAVA发票管理的收货单订单创建发票详情介绍

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》作者 公众号&#xff1a;山峯草堂&#xff0c;非技术多篇文章&#xff0c;专注于天道酬勤的 Java 开发问题、中国国学、传统文化和代码爱好者的程序人生&#xff0c;…

用十万字讲明白linux和java的零复制技术

linux I/O 读写方式 Linux提供了轮询、I/O中断以及DMA传输这3种磁盘与主存之间的数据传输机制。 轮询方式是基于死循环对 I/O 端口进行不断检测。 I/O中断方式 I/O 中断方式是指当数据到达时&#xff0c;磁盘主动向 CPU 发起中断请求&#xff0c;由 CPU 自身负责数据的传输…

10.31一些代码分析,香浓展开,移位器(桶形多位),二进制转格雷码

always的block之间&#xff0c;采用并行执行 always之内&#xff0c;采用非阻塞赋值&#xff0c;为顺序执行 一些代码分析 这个把使能信号和W信号组合在一起&#xff0c;进行case语句&#xff0c;即只有合并信号最高位为1时&#xff0c;才进行操作 always后面要写&#xff0…

springboot大学生就业推荐系统 毕业设计-附源码01535

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对学生就业管理等问题&#xff0c;对学生就业…

关于脉冲发生器,你知道多少?

01 引言 脉冲发生器&#xff08;Pulse Generator&#xff0c;PG&#xff09;是产生脉冲信号的专用仪器。它可以生成具有特定频率、幅值和脉冲宽度的脉冲信号&#xff0c;常用于各种科学、工程和技术领域中的实验、测试、通信和控制应用。 那么&#xff0c;对于一台脉冲发生器…

SDH传输分析仪有什么用? TFN D300S SDH传输分析仪详解

数字传输分析仪是数字通信中最重要、最基本的测试仪器&#xff0c;主要用于测试数字通信信号的传输质量&#xff0c;其主要测试参数包括误码、告警、开销、抖动和漂移等&#xff0c;其广泛应用于数字通信设备的研制、生产、维修和计量测试&#xff0c;还可应用于数字通信网络的…

自学VUE笔记

一、基础语法学习 1、Attribute 绑定 a、绑定单个属性&#xff1a;给这个div 增加id 属性 ​ <div v-bind:id"dynamicId"></div>简写&#xff1a; <div :id"dynamicId"></div> b、绑定多个属性值 data() {return {objectOf…

20年经典传承 | 性能圣典!火焰图发明者Brendan Gregg“神作”

20年20本经典畅销书 NO.9 豆瓣评分9.3 性能大师经典巨著 每一个学习性能优化/性能评估的工程师的必备手册 性能测量的水相当深&#xff0c;斯坦福大学的 John Ousterhout 教授在“Always Measure One Level Deeper”一文&#xff08;《ACM 通讯》杂志&#xff0c;2018 年第…

信创强国 | 安全狗荣获信创工委会技术活动单位证书

近日&#xff0c;安全狗荣获中国电子工业标准化技术协会信息技术应用创新工作委员会&#xff08;以下简称“信创工委会”&#xff09;颁发的信息技术应用创新工作委员会技术活动单位证书。 作为国内云原生安全领导厂商&#xff0c;安全狗在信息技术应用创新方面有多年的技术积累…