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

摘要:本文将介绍如何使用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 属性来设置列之间的空隙,以增加页面的可读性和美观度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字符集详解

常见字符集介绍 字符集基础知识&#xff1a; 计算机底层不可以直接存储字符的。 计算机中底层只能存储二进制(0、1) 。 二进制是可以转换成十进制的。 结论&#xff1a;计算机底层可以表示成十进制编号。计算机可以给人类字符进行编号存储&#xff0c;这套编号规则就是字符…

国内内卷太严重,还不考虑一下在海外接单?那这几个平台你知道吗?

作为一个程序员&#xff0c;在平台上接单赚点外快是再正常不过的事情了&#xff0c;但是现今国内各个平台都内卷比较严重&#xff0c;你是否考虑过去“外面的世界”看看&#xff1f; 如果想过&#xff0c;那么这几个外国的接单平台你都知道吗&#xff1f; 接下来就和我一起来看…

超实用的企业防范数据泄露小技巧!

超实用的企业防范数据泄露小技巧&#xff01; 小技巧1、加强员工培训&#xff0c;提高防范思想 及时向员工传达有关安全信息&#xff0c;加强员工意识、认识和执行安全措施&#xff0c;以防止数据泄露发生。 小技巧2、建立安全政策&#xff0c;明确处理流程 企业应该建立安…

Tower for Mac—Git客户端 支持M1

Tower是一款Mac OS X系统上的Git客户端软件&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户更加方便地管理和使用Git版本控制系统。以下是Tower的一些特点&#xff1a; 1. 界面友好&#xff1a;Tower的界面友好&#xff0c;使用户能够轻松地掌握软件的使用方法。 …

MySQL扩展语句和约束方式

一、扩展语句 复制&#xff0c;通过like这个语法直接复制bbb的表结构。只是复制表结构&#xff0c;不能复制表里面的数据 把bbb表里面的数据&#xff0c;复制到test&#xff0c;两个表数据结构要一致 创建一张表&#xff0c;test1,数据从bbb来&#xff0c;表结构也是bbb delete…

数据库深入浅出,数据库介绍,SQL介绍,DDL、DML、DQL、TCL介绍

一、基础知识&#xff1a; 1.数据库基础知识 数据(Data)&#xff1a;文本信息(字母、数字、符号等)、音频、视频、图片等&#xff1b; 数据库(DataBase)&#xff1a;存储数据的仓库&#xff0c;本质文件&#xff0c;以文件的形式将数据保存到电脑磁盘中 数据库管理系统(DBMS)&…

csapp datalab

知识点总结 1. 逻辑运算符关系 and&#xff08;与&#xff09;、or&#xff08;或&#xff09;和xor&#xff08;异或&#xff09;是逻辑运算符&#xff0c;用于对布尔值进行操作。它们可以在不同的逻辑表达式之间进行转换。下面是and、or和xor之间的转换规则&#xff1a; a…

网络协议--TCP的未来和性能

24.1 引言 TCP已经在从1200 b/s的拨号SLIP链路到以太数据链路上运行了许多年。在80年代和90年代初期&#xff0c;以太网是运行TCP/IP最主要的数据链路方式。虽然TCP在比以太网速率高的环境&#xff08;如T2电话线、FDDI及千兆比网络&#xff09;中也能够正确运行&#xff0c;但…

AcWing第 127 场周赛 - AcWing 5283. 牛棚入住+AcWing 5284. 构造矩阵 - 模拟+快速幂+数学

AcWing 5283. 牛棚入住 题目数据范围不大&#xff0c;直接暴力模拟即可 按照题目所说的意思即可。 #include <math.h> #include <stdio.h> #include <algorithm> #include <cstring> #include <iostream> using namespace std; const int N 1…

Spring Cloud之ElasticSearch的学习【详细】

目录 ElasticSearch 正向索引与倒排索引 数据库与elasticsearch概念对比 安装ES、Kibana与分词器 分词器作用 自定义字典 拓展词库 禁用词库 索引库操作 Mapping属性 创建索引库 查询索引库 删除索引库 修改索引库 文档操作 新增文档 查找文档 修改文档 全量…

使用内网穿透工具进行支付宝沙箱环境支付的SDK接口远程测试

Java支付宝沙箱环境支付&#xff0c;SDK接口远程调试【内网穿透】 1.测试环境 MavenSpring bootJdk 1.8 2.本地配置 获取支付宝支付Java SDK,maven项目可以选择maven版本,普通java项目可以在GitHub下载,这里以maven为例 SDK下载地址&#xff1a;https://doc.open.alipay.com…

删除的PPT怎么找回来?4个必备恢复方法!

“最近的期末展示需要制作一个PPT&#xff0c;我熬了几个大夜才完成了&#xff0c;但是不知道怎么的我在删除其他文件时不小心把这个PPT一起删掉了&#xff0c;有什么方法可以帮我找回这个误删的PPT吗&#xff1f;” 我们在工作和学习中&#xff0c;经常都需要使用到PPT&#x…

白票某度自媒体混剪剪辑视频素材/爬虫软件说明文档

大家好&#xff0c;我是淘小白~ 软件&#xff1a;某度自媒体混剪素材爬虫软件 语言&#xff1a;Python 说明文档&#xff1a; 1、自定义关键词采集 2、采集百度aigc视频素材&#xff0c;经过测试&#xff0c;使用剪映的文字成片某度视频素材&#xff0c;可过头条的原创检测…

杂牌行车记录仪特殊AVI结构恢复案例

最近遇到一个杂牌的行车记录仪需要恢复数据&#xff0c;其使用AVI格式&#xff0c;但是在扫描恢复的过程中却发现厂家对其AVI结构进行了“魔改”致程序无法正常识别 故障存储:16G SD卡 fat32文件系统 故障现象: 16G的SD卡&#xff0c;在发生事故后客户尝试自行接到手机上读…

Mybatis—基础操作

mybatis入门后&#xff0c;继续学习mybatis基础操作。 目录 Mybatis基础操作准备工作删除操作日志输入预编译SQLSQL注入参数占位符 新增操作基本新增添加后返回主键 更新操作查询操作根据id查询数据封装条件查询条件查询 Mybatis基础操作 准备工作 根据下面页面原型及需求&am…

【产品运营】产品需求应该如何管理

产品项目在进行时经常会有一些需求需要实现&#xff0c;需求是产品更新迭代的动力&#xff0c;需求也是从用户诉求转化而来&#xff1b;在做需求管理时&#xff0c;我们需要判断一个需求的优先级等方面&#xff0c;对产品进行优化&#xff1b; 目录&#xff1a; 一、 为什么要…

游戏在小米设备上因自适应刷新率功能,帧率减半

1&#xff09;游戏在小米设备上因自适应刷新率功能&#xff0c;帧率减半 2&#xff09;Lua在计算时出现非法值&#xff0c;开启Debugger之后不再触发 3&#xff09;如何在Unity中实现液体蔓延的效果 这是第357篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&…

【Tomcat】如何在idea上部署一个maven项目?

目录 1.创建项目 2.引入依赖 3.创建目录 4.编写代码 5.打包程序 6.部署项目 7.验证程序 什么是Tomcat和Servlet? 以idea2019为例&#xff1a; 1.创建项目 1.1 首先创建maven项目 1.2 项目名称 2.引入依赖 2.1 网址输入mvnrepository.com进入maven中央仓库->地址…

SpringBoot整合自签名SSL证书,转变HTTPS安全访问(单向认证服务端)

前言 HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面&#xff0c;事物皆具两面性&#xff0c;它也是有不足之处的。例如&#xff1a; 通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能会被窃听。不验证通信方的身份&#xff0c;因此有可能会遭遇…

LSF 概览——了解 LSF 是如何满足您的作业要求,并找到最佳资源来运行该作业的

LSF 概览 了解 LSF 是如何满足您的作业要求&#xff0c;并找到最佳资源来运行该作业的。 IBM Spectrum LSF ("LSF", load sharing facility 的简称) 软件是行业领先的企业级软件。LSF 将工作分散在现有的各种 IT 资源中&#xff0c;以创建共享的&#xff0c;可扩展…