antd-vue + vue3 实现a-table动态增减行,通过a-from实现a-table行内输入验证

news2024/11/24 5:57:47
 一、效果图

图一:校验效果

二、主要代码

注意:

1、form 与 table 绑定的是同一个数据 tableSource 并且是一个数据(ElementUI 需要 对象包数组)

2、form用的是 name 绑定  -> :name="[index, 'vlan_id']"

3、form-item 总要需要加上 rules  -> :rules="rules.blur"

<a-form ref="tableFormRef" :model="tableSource" :label-col="{ style: { width: '10px' } }" :wrapper-col="{ span: 0 }" :rules="rules">
  <a-table
    class="ant-table-striped"
    bordered
    :dataSource="tableSource"
    :columns="tableColumns"
    :pagination="false"
    :scroll="{ x: 1260 }"
    :row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped' : null)">

    <template #bodyCell="{ column, text, record, index }">

      <template v-if="column.dataIndex == 'vlan_id'">
        <a-form-item class="custom-form-item" label=" " :name="[index, 'vlan_id']" :rules="rules.blur">
          <a-input style="width: 100%" v-model:value="record[column.dataIndex]"></a-input>
        </a-form-item>
      </template>

    </template>

  </a-table>
</a-form>

1、template
<div class="bottom-box">
  <div class="title-box">
    <p class="order-title">工单操作</p>
    <a-button style="margin: 0 0 10px 0px" type="primary" size="small" @click="handleRowAdd">增加行</a-button>
  </div>
  <div class="table-box">
    <a-form ref="tableFormRef" :model="tableSource" :label-col="{ style: { width: '10px' } }" :wrapper-col="{ span: 0 }" :rules="rules">
      <a-table
        class="ant-table-striped"
        bordered
        :dataSource="tableSource"
        :columns="tableColumns"
        :pagination="false"
        :scroll="{ x: 1260 }"
        :row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped' : null)">
        <template #bodyCell="{ column, text, record, index }">
          <template v-if="column.dataIndex == 'vlan_id'">
            <a-form-item class="custom-form-item" label=" " :name="[index, 'vlan_id']" :rules="rules.blur">
              <a-input style="width: 100%" v-model:value="record[column.dataIndex]"></a-input>
            </a-form-item>
          </template>
          <template v-else-if="column.dataIndex == 'cloud'">
            <a-form-item class="custom-form-item" label=" " :name="[index, 'cloud']" :rules="rules.cloud">
              <a-select style="width: 100%" v-model:value="record[column.dataIndex]" @change="hanlePlatformChange(index)">
                <a-select-option v-for="item in platforms" :value="item.value" :key="item.value">{{ item.label }}</a-select-option>
              </a-select>
            </a-form-item>
          </template>
          <template v-else-if="column.dataIndex == 'related_pool'">
            <a-form-item class="custom-form-item" label=" " :name="[index, 'related_pool']" :rules="rules.relatedPool">
              <a-select style="width: 100%" v-model:value="record[column.dataIndex]">
                <a-select-option v-for="item in platform[index].children" :value="item.value" :key="item.value">{{ item.label }}</a-select-option>
              </a-select>
            </a-form-item>
          </template>
          <template v-else-if="column.dataIndex == 'allocated' || column.dataIndex == 'purpose' || column.dataIndex == 'vlan_domain'">
            <a-form-item class="custom-form-item" label=" " :name="[index, column.dataIndex]" :rules="rules.change">
              <a-select style="width: 100%" v-model:value="record[column.dataIndex]">
                <a-select-option v-for="item in column.list" :value="item.value" :key="item.value">{{ item.label }}</a-select-option>
              </a-select>
            </a-form-item>
          </template>
          <template v-else-if="column.dataIndex == 'operation'">
            <a-button style="margin: 0 5px" type="primary" size="small" @click="handleRowDel(index)" danger>删除</a-button>
          </template>
          <template v-else>
            <a-input style="width: 100%" v-model:value="record[column.dataIndex]"></a-input>
          </template>
        </template>
      </a-table>
    </a-form>
  </div>
  <div class="btn-box">
    <a-button v-if="sendFail" style="margin: 0 5px" @click="handleCancleApply">取消申请</a-button>
    <a-button style="margin: 0 5px" type="primary" @click="handleSubmit">提交</a-button>
  </div>
</div>

2、script

<script setup>
import { h, reactive, ref } from 'vue';

// 路由跳转
import { useRouter } from 'vue-router';
const { currentRoute } = useRouter();
const router = useRouter();

const tableFormRef = ref(); // form标签

/**
 *
 * 表格数据
 */
let tableSource = ref([]);

// 校验规则
const rules = {
  blur: [{ required: true, message: '请输入', trigger: 'blur' }],
  change: [{ required: true, message: '请选择', trigger: 'change' }],
  cloud: [{ required: true, message: '请选择所属平台', trigger: 'change' }],
  relatedPool: [{ required: true, message: '请选择硬件资源池', trigger: 'change' }]
};

// 提交申请
const handleSubmit = () => {
  let params = {};
  if (tableSource.value.length == 0) {
    return message.error('工单不能为空!');
  }

  // form的校验方法
  tableFormRef.value.validate().then(() => {
    const tableSourceParams = JSON.parse(JSON.stringify(tableSource.value));
    params = {
      ...formState, // 其他的参数
      status: 1,
      deviceLists: tableSourceParams
    };
    // 接口
    submitOrder(params).then(res => {
      if (res.code == 8200) {
        cancelId.value = res.data.id;
        if (res.data.status == 3) {
          message.success('二级VLAN地址入网添加成功!');
          router.push({
            path: '/network-access/vlan'
          });
        } else if (res.data.status == 2) {
          message.error(failTip(res.data.errorMessage));
          sendFail.value = true;
          // if (route.query.id) {
          //   echoDate();
          // }
        }
      }
    });
  });
};
</script>

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

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

相关文章

MES管理系统中常规的生产建模有哪些

随着制造业的快速发展&#xff0c;MES生产管理系统已经成为了现代制造业不可或缺的核心系统。MES通过对生产过程进行建模&#xff0c;实现了生产过程的可视化、可控制和可优化&#xff0c;为企业提供了全方位的生产管理解决方案。本文将深化对MES管理系统及其主要生产模型的理解…

React构建组件的方式有哪些?区别?

一、是什么 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念&#xff08;组件&#xff09;来实现开发的模式 在React中&#xff0c;一个类、一个函数都可以视为一个组件 在之前文章中&#xff0c;我们了解到组件所存在的优势&#xff1a; 降低整个系统的耦合度&am…

大功率继电器 UEG/F-4DPDT EDP01-RDI/1抗干扰型 轨道继电器 josef约瑟

UEG/F系列抗干扰型中间继电器电力系统和工业自动化的装置中,明确而可靠的信号护展和电隔离技术变得日益重要.UEG/F系列抗干扰继电器应用在电力系统及工业控制领域中,用于外界干扰较大的接点信号的重动、采集。 系列型号 UEG/F-2H2D抗干扰中间继电器;UEG/F-1H1D抗干扰中间继电器…

中国电子学会2023年09月份青少年软件编程Scratch图形化等级考试试卷四级真题(含答案)

2023-09 Scratch四级真题 分数&#xff1a;100 题数&#xff1a;24 测试时长&#xff1a;60min 一、单选题(共10题&#xff0c;共30分) 1.角色为一个紫色圆圈&#xff0c;运行程序后&#xff0c;舞台上的图案是&#xff1f;&#xff08;A &#xff09;(3分) A. B. C. …

【云栖2023】林伟:大数据AI一体化的解读

本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;林伟 | 阿里云研究员&#xff0c;阿里云计算平台事业部首席架构师&#xff0c;阿里云人工智能平台PAI和大数据开发治理平台DataWorks负责人 演讲主题&#xff1a;大数据AI一体化…

dart中字符串的常用操作方法函数,和python有点像

在开发语言中&#xff0c;字符串操作可谓是非常的多&#xff0c;所以需要记住很多字符串这类的相关函数和方法&#xff0c;至少最常用的几种是要记住的&#xff1a;切分&#xff0c;包含&#xff0c;查找&#xff0c;是否以XX开头等等 void run() {var str1 "你好&#…

moc_ XX.cpp 中的函数没有定义

解决办法&#xff1a; 直接将 moc_OnlyTest.cpp 文件&#xff0c;添加到工程目录下&#xff0c;解决。

使用swagger-typescript-api

引言 前后端分离大致是这样的 后端&#xff1a;控制层 / 业务层 / 数据操作层前端&#xff1a;控制层 / 视图层 前后端的控制层&#xff0c;实际上就是前后端接口的对接 前后端分离&#xff0c;实现了更好地解耦合&#xff0c;但也引入了接口对接的过程&#xff0c;这个过程…

什么是外贸SOHO建站?新手如何做好推广?

新手外贸SOHO建站教程&#xff1f;海洋建站谷歌SEO优化步骤&#xff1f; 外贸SOHO建站是一种为小型外贸企业和个体经营者提供的网站建设服务&#xff0c;旨在帮助他们在国际市场上建立自己的在线存在&#xff0c;从而拓展业务。海洋建站将深入探讨外贸SOHO建站的含义&#xff…

vue下使用Echarts5绘制基础图表

项目使用Vue3加Echarts5绘制的基本图表&#xff0c;图表自适应浏览器窗口大小 先上图&#xff0c;大屏小屏都可完美展示&#xff0c;纯属练手 一 先上图 1.任意缩放窗口的大小 2.平板 3.电脑 4.饼图 5.折线图 二 后上代码 <script lang"ts"> import {d…

Jwt,Token,Cookie,Session之间的区别

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

ROS学习笔记(6):ros_control

1.ros_control简介 ros_control - ROS Wiki ros_control是为ROS提供的机器人控制包&#xff0c;包含一系列控制器接口、传动装置接口、控制器工具箱等,有效帮助机器人应用功能包快速落地&#xff0c;提高开发效率。 2.ros_control框架 ros_control总体框架&#xff1a; 针对…

【springboot配置项动态刷新】与【yaml文件转换为java对象】

文章目录 一&#xff0c;序言二&#xff0c;准备工作1. pom.xml引入组件2. 配置文件示例 三&#xff0c;自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四&#xff0c;yaml文件转换为java对象1. 无法使…

Go 语言初探:从基础到实战

1.Go概述 程序是一段计算机指令的有序组合。程序算法数据结构。任何程序都可以将模块通过三种基本的控制结构&#xff08;顺序、分支、循环&#xff09;进行组合来实现。 Go&#xff08;也称为Golang&#xff09;是一种由Google开发的开源编程语言。设计目标是使编程更简单、…

配置802.1x本地认证,以识别用户身份的示例

组网图形 图1 802.1x本地认证组网图 规格组网需求操作步骤配置注意事项 规格 适用于所有版本、所有形态的AR路由器。 组网需求 PC1(10.10.10.2/30)直接连接到RouterA的Eth2/0/1端口&#xff0c;RouterA的VLANIF10接口IP地址10.10.10.1/30&#xff08;为PC1上的网关IP地址&a…

基于CLIP的图像分类、语义分割和目标检测

OpenAI CLIP模型是一个创造性的突破&#xff1b; 它以与文本相同的方式处理图像。 令人惊讶的是&#xff0c;如果进行大规模训练&#xff0c;效果非常好。 在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D…

一维码和二维码图像优化——提高读码率

1.算子 1.1 decompose3 &#xff08;彩色图像分割算子&#xff09; 算子&#xff1a;decompose3 ——将三通道图像转换为三个图像函数原型&#xff1a;decompose3(MultiChannelImage : Image1, Image2, Image3 : : ) 功能&#xff1a;将3通道图像转换为具有相同定义域&#…

智慧安防:监控防盗两不误的安防视频监控系统是什么样的?

随着社会的不断发展&#xff0c;安全问题越来越受到人们的关注&#xff0c;特别是对于居住在城市里的人们来说&#xff0c;盗窃问题是影响他们生活质量的重要因素之一。因此&#xff0c;根据市场需求&#xff0c;以监控防盗两不误的智慧监控系统得到了广泛的推广和应用。 一般…

不充不行(同时跑三辆车)

欢迎来到程序小院 不充不行 玩法&#xff1a;点击鼠标左键长按充电桩&#xff0c;别让车落回底线&#xff0c;三辆车同时在跑&#xff0c;要控制三个充电桩的电量&#xff0c;电量为0即为游戏结束&#xff0c;看看你能坚持多少秒哦^^。开始游戏https://www.ormcc.com/play/gam…

迅镭激光与江苏中红外激光研究院达成战略合作意向

11月6日&#xff0c;江苏中红外激光研究院院长沈德元、江苏师范大学物电学院系主任韩彩芹、江苏中红外激光研究院技术副总王飞等领导莅临迅镭激光调研指导并进行合作会谈&#xff0c;迅镭激光董事长颜章健热情接待。双方就成果转化、产业合作、专业人才培养等方面进行深入洽谈&…