vue+a-form 动态表格,动态增加动态删除

2023-11-02

在这里插入图片描述

思路借鉴了一位大佬的文章,原文地址如下:
版权声明:本文为qq_42203909原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:antd实现动态增减表单项,支持赋初始值!
首先是封装子组件,自己起个名字。
v-decorator官网上是这么说的:经过 v-decorator 包装的控件,表单控件会自动添加 value ,数据同步将被 Form 接管,我自己的理解v-decorator相当于v-model绑的值,只是操作值的方法不一样,v-model可以直接赋值,v-decorator需要用到 this.form.setFieldsValue({}) 方法修改值
1、 通过 v-decorator绑值, ${title}Name[${item}],在父组件的子组件标签上会定义title为partOne。相当于给每一项都增加了一个相同的前缀,比如:partOneName[0]
2、initialValue是form表单的默认值
3、a-form可以直接在模板区写校验规则,如果要自定义,可以写 rules: [{ validator: validatorUrl }],在methods中定义validatorUrl 校验方法即可
4、

<template>
  <div>
    <div class="dynamic-wrap" :style="{ maxHeight: wrapHeight + 'px' }">
      <div v-for="item in keysList" :key="item">
        <a-row :gutter="24">
          <a-col :span="12" >
            <a-form-item label="xx地址:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 18 }" >
              <a-input
                autocomplete="off"
                placeholder="请填写xx地址"
                v-decorator="[
                  `${title}Name[${item}]`,
                  {
                    initialValue: arr[item] ? arr[item].name : undefined,
                    rules: [{ validator: validatorUrl }]
                  }
                ]"
              />
            </a-form-item>
          </a-col>

          <a-col :span="9">
            <a-form-item label="xx:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 18 }">
              <a-input
                autocomplete="off"
                placeholder="请填写xx"
                v-decorator="[
                  `${title}Age[${item}]`,
                  {
                    initialValue: arr[item] ? arr[item].age : undefined,
                    rules: [{ validator: validatorPort }]
                  }
                ]"
              />
            </a-form-item>
          </a-col>
          <a-col :span="2" style="padding-left: 0px">
            <a-form-item :labelCol="{ span: 0 }" :wrapperCol="{ span: 24 }">
              <template v-if="item === id">
                <a-button type="dashed" icon="plus" @click="addRow(item)" class="addRowBtn"></a-button>
              </template>
              <template v-else>
                <a-button type="dashed" icon="minus" @click="removeRow(item)" class="minusRowBtn"></a-button>
              </template>
            </a-form-item>
          </a-col>
        </a-row>
      </div>
      <a-row>
        <a-col :span="23">
          <a-form-item label="xx" :labelCol="{ span: 3 }" :wrapperCol="{ span: 19 }">
            <a-input
              autocomplete="off"
              placeholder="请输入xx名称,如: Topic"
              v-decorator="[
               `${title}topic`,
                {
                  initialValue: arr['partOnetopic'],
                  rules: [{ validator: validatorTopic }],
                  validateTrigger: []
                }
              ]"
            />
          </a-form-item>
        </a-col>
      </a-row>
    </div>
  </div>
</template>

<script>
export default {
  name: 'DynamicForm',
  props: {
    title: {
      type: String,
      default: ''
    },
    wrapHeight: {
      // 表单容器的高度
      type: Number,
      default: 120
    },
    arr: {
      type: Array,
      default: function() {
        return []
      }
    }
  },
  data() {
    return {
      id: 0,
      keysList: []
    }
  },
  created() {
    this.form = this.$form.createForm(this)//创建form表单
    this.init()
  },
  methods: {
    // 初始化
    init() {
      const arr = [0]
      if (this.arr[0].partOneName.length !== 0) {
        // console.log('this.arr[0].partOneName.length', this.arr[0].partOneName.length);
        for (let i = 1; i < this.arr[0].partOneName.length; i++) {
          arr.push(i)
          this.id = this.id + 1//通过id自加的方式增加form表单
        }
      }
      this.keysList = arr
    },
    // 移除某行
    removeRow(k) {
      if (this.keysList.length === 1) {
        // 如果存在可以移除所有行的情况,把条件改为this.keysList.length === 0即可
        return
      }
      this.keysList = this.keysList.filter(item => item !== k)
    },
    // 新增一行
    addRow() {
      if (this.keysList.length < 6) {//需求需要限制为只能增加6行,如果无线增加,可以去掉条件
        this.id = this.id + 1
        this.keysList = this.keysList.concat(this.id)
      } else {
        this.$message.error('新增不可以超过6行!')
      }
    },

    // 验证xx正则
    validatorPort(rule, value, callback) {
      if (value) {
        if (!/^\d{2,5}$/.test(value)) {
          callback(new Error('请输入正确的xx'))
        } else {
          callback()
        }
      } else {
        callback()
      }
    },
   
}
</script>

<style lang="less" scoped>
.dynamic-wrap {
  padding-top: 10px;
  background-color: white;
  overflow-y: scroll;
  overflow-x: hidden;
  &::-webkit-scrollbar {
    width: 7px;
  }
  &::-webkit-scrollbar-thumb {
    background: #d8d8d8;
    border-radius: 10px;
  }
  &::-webkit-scrollbar-track-piece {
    background: transparent;
  }

}
.minusRowBtn {
  color: #f5222d;
  background: #fff1f0;
  border-color: #ffa39e;
  padding-right: 7px;
  padding-left: 7px;
  height: 29px;
  margin-left: 10px;
}
.addRowBtn {
  // width: 70%;
  color: #1890ff;
  border-color: #91d5ff;
 background: #d2e4ee;
    padding-right: 7px;
  padding-left: 7px;
  height: 29px;
  margin-left: 10px;
  // margin: 0px 0px 20px 70px;
}
/deep/ .ant-form-item-label{
 &::before{
    display: inline-block;
    margin-right: 4px;
    color: #f5222d;
    font-size: 14px;
    font-family: SimSun, sans-serif;
    line-height: 1;
    content: '*';
  }
}
</style>

然后在父组件中引入并使用

import DynamicForm from './kafkaForm.vue'
const PARTONE = 'partOne'
 export default {
  components: { DynamicForm },
  data() {
    return {
      arr: [
        // 模拟从接口获取到的数据(如编辑场景)
        { partOneName: [], partOneAge: [], partOnetopic: '' }
      ],
      PARTONE,    
      Kafkaform: this.$form.createForm(this),
    }
  },

模板区:

  <a-form :form="Kafkaform" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" >
      <dynamic-form :title="`${PARTONE}`" :wrapHeight="360" :arr="arr" />
    </a-form>

方法中:
方法里的代码不太好贴,这个要根据你实际情况来获取值,以下代码仅供参考

            this.arr[0].partOneName = this.firstAddress
            this.arr[0].partOneAge = this.lastAddress
            setTimeout(() => {
              this.Kafkaform.setFieldsValue({ partOnetopic: Lastkafkaurl })
              this.Kafkaform.setFieldsValue({ partOneAge: this.arr[0].partOneAge })
              this.Kafkaform.setFieldsValue({ partOneName: this.arr[0].partOneName })
            }, 0)

基本上就是这样了,有问题可以私信我,看到会及时回复你

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue+a-form 动态表格,动态增加动态删除 的相关文章

随机推荐

  • QML VideoOutput 显示 YUV420P 数据流

    查看VideoOutPut说明文档 对source属性有以下说明 you can provide a QObject based class with a writable videoSurface property that can ac
  • Electron 收集崩溃日志

    概述 对于任何的客户端应用 开发者都希望能够在用户上的手上记录下相关信息以便了解真实的使用情况 一般情况下 分为以下两种信息 正常日志 在不涉及隐私的情况下 让开发者了解用户使用客户端的详细情况 从这些情况中提炼的信息能够让开发者根据用户的
  • QT类学习系列(8)- QPushButton,QToolButton的区别

    QPushButton与QToolButton的区别 weixin 42073232的博客 CSDN博客https blog csdn net weixin 42073232 article details 84848142 QToolBu
  • MyBatis框架(四)自定义映射

    resultMap处理字段和属性的映射关系 若字段名和实体类中的属性名不一致 则可以通过resultMap设置自定义映射 我们创建员工表如下所示 我们创建的部门表如下所示 多个员工对应一个部门 是一个多对一的关系 我们要把关系设置在多的地方
  • 七夕节教你怎么选男朋友/女朋友~基于PaddleHub的身材打分系统

    文章目录 一 项目背景 PaddleHub 介绍 二 效果展示 三 实现思路 四 具体步骤 1 安装 PaddleHub 到最新版本 2 新建目录 3 完成关键点检测 4 比例测算及打分 5 结果展示 五 总结与展望 一 项目背景 各位小哥
  • 计算机操作系统手册,轻松的开发一个操作系统(指导手册)

    轻松的开发一个操作系统 指导手册 标签 翻译家 编程 操作系统 chapter 1 前言 我们都使用过操作系统 又或者写过某个系统上运行着的程序 但操作系统到底是来做什么的 我所看到的工作多少是硬件完成的又有多少是软件完成的 电脑实际上是如
  • adb no permissions问题

    Google一番 得知可以通过用root权限启动adb server来解决问题 但是每次用adb不会很麻烦嘛 后来发现在SDK的帮助文档里有关于这个问题的说明 If you re developing on Ubuntu Linux you
  • 理解 $nextTick 的作用

    有同学在看 Vue 官方文档时 对 API 文档中的 Vue nextTick 和 vm nextTick 的作用不太理解 其实如果看一下深入响应式原理 vue js中的有关内容 可能会有所理解 不过有些同学可能看到这个标题之后就选择跳过了
  • rsync同步脚本

    bin bash export LANG C date date Y m d H M red echo e 033 0 31m blue echo e 033 0 36m white echo e 033 37m rsync usr bin
  • 解决克隆虚拟机无法上网问题

    通过VMware克隆出来一台linux的虚拟机 但是发现没有办法上网 然后上网查 原来是在linux中有唯一标识网卡的UUID 我们是通过克隆过来的 那么他们的UUID MAC地址和IP地址都相同了 所以导致克隆出来的机子没有办法上网 下面
  • access对比数据_数据分析师有理由爱Sqlserver之四-七大数据库测评Sqlserver胜出

    虽说各家数据库产品大同小易 学会一家 其他家都可以很快上手 但和编程语言的选择一样 人的精力有限下 只能深入研究一家的产品 故在学习之前 认真去评估应该选择哪一家数据库学习 这样的时间也很值得 总比学到一半不断地更换不同产品所浪费的时间好得
  • 一类学习(OCSVM)

    20201102 0 引言 我记得我第一次接触一类学习的时候 是在一本讲解异常流量的书上 大概18年的时候 当时有一个需求 就是所处的场景下 只能拥有一类数据 而其他类的数据 要不获取不到 要不获取了也不具备什么代表性 总体上就是这么一个场
  • VTK和Cmake的安装并运行一个vtk的案例

    VTK的安装并运行一个项目 1 CMAKE安装 要安装VTK的话首先需要安装CMAKE CMAKE的官网 https cmake org download 进入Cmake下载网页 可以看到很多版本 我们选择最新的 在文件列表中 我们选择最便
  • Java之类与对象

    作者简介 zoro 1 目前大一 正在学习Java 数据结构等 作者主页 zoro 1的主页 欢迎大家点赞 收藏 加关注哦 目录 初始面向对象 什么是面向对象 面向对象和面向过程区别 类的定义和使用 什么是类 类的定义 类的实例化 什么是类
  • 关于绘图的卡顿解决方案

    在Android应用中 cocos的渲染和js的逻辑是在gl线程中进行的 而android本身的UI更新是在app的UI线程进行的 所以如果我们在js中调用的Java方法有任何刷新UI的操作 都需要在UI线程进行 如果画板的控件继承于Vie
  • Redis6+PHP:实现根据经纬度计算出附近门店距离

    一 开始介绍 Redis GEO 1 Redis GEO 主要用于存储地理位置信息 并对存储的信息进行操作 该功能在 Redis 3 2 版本新增 Redis GEO 操作方法 geoadd 添加地理位置的坐标 geopos 获取地理位置的
  • CloudCompare——泊松重建

    目录 1 简介 2 利用输出密度 3 相关代码 博客长期更新 本文最近更新时间为 2023年8月10日 1 简介 算法原理见 泊松重建算法原理介绍 qPoissonRecon是 Poisson Surface Reconstruction
  • 单片机原理概念

    参考 单片机原理概念 作者 爱学习的小王呀 发布时间 2020 11 27 08 58 08 网址 https blog csdn net hongliwong article details 110219821 spm 1001 2014
  • SCL教程之如何使用SCL创建简单控制程序

    最近有不少朋友都对SCL编程感兴趣 网上的相关资料又较少今天我就为大家简单介绍一下如何使用SCL创建简单程序 1 首先我要先说明一下使用STEP7 或 PCS7都可以进行SCL编程 其编程方式与TIA的编程方式类似 但是语法稍有不同 今天我
  • vue+a-form 动态表格,动态增加动态删除

    思路借鉴了一位大佬的文章 原文地址如下 版权声明 本文为qq 42203909原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 antd实现动态增减表单项 支持赋初始值 首先是封装子组件 自己起个