前端实现表单嵌套表格,el-form内部包着el-table并实现校验功能与动态添加表格的表单数据

2023-10-31

一、待实现的场景图,如下

在这里插入图片描述

二、元素部分实现方式代码如下图

   <el-form
        :model="editPigStatusForm"
        ref="editPigStatusRef"
        label-width="90px"
        label-position="right"
        class="edit-form"
      >
        <el-table
          :data="editPigStatusForm.pigStatusTableData"
          ref="pigStatusRef"
          :row-class-name="tableRowClassName"//为了删除行操作更精准找到目标对象
          border
          header-align="center"
        >
          <el-table-column type="selection" width="55"> </el-table-column>
          <el-table-column label="编号" align="center">
          // 表头定义
            <template slot="header">
              <p>
                <span style="color: red; font-size: 16px">*</span
                >&nbsp;编号
              </p>
            </template>
            // 表主体定义
            <template slot-scope="scope">
              <el-form-item
                :prop="`pigStatusTableData.${scope.$index}.pigNo`"
                :rules="editPigStatusForm.editPigStatusRules.pigNo"
              >
                <el-select
                  v-model="scope.row.pigNo"
                  filterable
                  placeholder="请选择编号"
                  @change="
                    (val) => {
                      earsSelectChange(val, scope.$index);
                    }
                  "
                >
                  <el-option
                    v-for="item in ajustEarList"
                    :key="item.pigNo"
                    :label="item.pigNo"
                    :value="item.pigNo"
                    :disabled="item.disabled"
                  >
                  </el-option>
                </el-select>
              </el-form-item>
            </template>
          </el-table-column>
          // 该列的展示是选择编号后带出,自动显现
          // 所以在编号的change事件内部对此列赋值
          <el-table-column
            prop="pigstyName"
            width="100"
            align="center"
            label="所在屋舍"
          >
            <template slot="header">
              <p>
                <span style="color: red; font-size: 16px">*</span>&nbsp;所在屋舍
              </p>
            </template>
          </el-table-column>
          //此处的处理同“所在屋舍”相同
          <el-table-column
            prop="adjustmentBeforeState"
            align="center"
            width="100"
            label="调整前状态"
          >
            <template slot="header">
              <p>
                <span style="color: red; font-size: 16px">*</span
                >&nbsp;调整前状态
              </p>
            </template>
          </el-table-column>
          // 此列为下拉数据,数据源为固定的两种
          // 具体展示哪一种根据后端返回的type类型判断
          <el-table-column label="调整后状态" align="center">
            <template slot="header">
              <p>
                <span style="color: red; font-size: 16px">*</span
                >&nbsp;调整后状态
              </p>
            </template>
            <template slot-scope="scope">
              <el-form-item
                :prop="`pigStatusTableData.${scope.$index}.adjustmentAfterState`"
                :rules="
                  editPigStatusForm.editPigStatusRules.adjustmentAfterState
                "
              >
                <el-select
                  v-model="scope.row.adjustmentAfterState"
                  filterable
                  placeholder="请选择调整后状态"
                >
                //因为每一行的数据受type类型的影戏,导致每一行的数据都不一致
                //所以循环的数据为item in scope.row.adjustAfterStateData
                  <el-option
                    v-for="item in scope.row.adjustAfterStateData"
                    :key="item.statusId"
                    :label="item.statusName"
                    :value="item.statusId"
                  >
                  </el-option>
                </el-select>
              </el-form-item>
            </template>
          </el-table-column>
          / /input框展示
          <el-table-column label="调整原因" align="center">
            <template slot="header">
              <p>
                <span style="color: red; font-size: 16px">*</span>&nbsp;调整原因
              </p>
            </template>
            <template slot-scope="scope">
              <el-form-item
                :prop="`pigStatusTableData.${scope.$index}.adjustmentReasons`"
                :rules="editPigStatusForm.editPigStatusRules.adjustmentReasons"
              >
                <el-input
                  v-model="scope.row.adjustmentReasons"
                  class="ajust-reason"
                ></el-input>
              </el-form-item>
            </template>
          </el-table-column>
          <el-table-column label="备注" align="center">
            <template slot-scope="scope">
              <el-form-item
                :prop="`pigStatusTableData.${scope.$index}.remarks`"
                :rules="editPigStatusForm.editPigStatusRules.remarks"
              >
                <el-input v-model="scope.row.remarks"></el-input>
              </el-form-item>
            </template>
          </el-table-column>
        </el-table>
        <el-button type="text" @click="addLineBtn">+增加行</el-button>
        <el-button type="text" @click="removeLineBtn">-删除行</el-button>
      </el-form>

解析:
prop使用模版语法进行针对行表单绑定与实现,

:prop="`pigStatusTableData.${scope.$index}.pigNo`"

rules校验实现方式如下:

   :rules="editPigStatusForm.editPigStatusRules.pigNo"

三、文件data内部变量的定义如下

data(){
  return {
      editPigStatusForm: {
        pigStatusTableData: [], //表格数据集合
        //  校验规则
        editPigStatusRules: {
          earNo: [ { required: true, message: "请选择耳号/批次号", trigger: "change" } ],
          editHoggeryId: [ { required: true, message: "请选择所在猪场", trigger: "blur" }],
          adjustmentAfterState: [  { required: true, message: "请选择调整后状态", trigger: "change" } ],
          adjustmentReasons: [
            { required: true, message: "请输入调整原因", trigger: "blur" },
            {  min: 1,max: 20, message: "长度在 1 到 20 个字符",  trigger: "blur"  } ],
          remarks: [ { min: 1,max: 20,message: "长度控制在 20 个字符", trigger: "blur"} ],
        },
      },
  }
}

四、js实现选中编号后带出所在屋舍,调整前状态数据并赋值

定义事件:

earsSelectChange(val, scope.$index);

注:ajustEarList数据集合里面有很多数据

 // table耳号/批次号change事件
    earsSelectChange(value, index) {
      // value: 发生变化后的数值
      // index: 哪一行发生的变化
      this.ajustEarList.forEach((totalItem) => {
        // totalItem:对象数据详情
        if (totalItem.pigNo === value) {
          // 所在猪舍赋值
          this.editPigStatusForm.pigStatusTableData[index].pigstyName =
            totalItem.pigstyName;
          // 调整前状态 赋值
          this.getBeforeAjustData(totalItem.adjustmentBeforeState, index);
        }
      });
    },

五、添加行 、删除行实现方式

 tableRowClassName(row, index) {
      // 给每条数据添加一个索引  在删除时可以对应唯一标识
      row.row.index = row.rowIndex;
},
   // 删除行 btn
    removeLineBtn() {
      this.$refs.pigStatusRef.selection.forEach((choosenItem) => {
        this.ajustEarList.some((earItem) => {
          if (earItem.pigNo === choosenItem.pigNo) {
            earItem.disabled = false;
          }
        });
        this.editPigStatusForm.pigStatusTableData.some(
          (tableItem, tableIndex) => {
            if (tableItem.index === choosenItem.index) {
              this.editPigStatusForm.pigStatusTableData.splice(tableIndex, 1);
            }
          }
        );
      });
    },
    // 添加行
   addLineBtn() {
      this.editPigStatusForm.pigStatusTableData.push({
        earNo: "",
        pigstyName: "",
        adjustmentBeforeState: "",
        adjustmentAfterState: "",
        adjustmentReasons: "",
        remarks: "",
      });
    },
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端实现表单嵌套表格,el-form内部包着el-table并实现校验功能与动态添加表格的表单数据 的相关文章

随机推荐

  • requests.exceptions.InvalidHeader: Value for header {XX: (‘XX‘,)} must be of type str or bytes, not

    requests exceptions InvalidHeader Value for header xxx xxx must be of type str or bytes not
  • Http协议及各版本对比

    前言 本文主要简单介绍http协议发展的历史版本以及https的安全机制 对于更多深入协议内层及网络通信相关的知识 在此暂不做总结 何谓Http协议 超文本传输协议 Hypertext Transfer Protocol HTTP 是一个简
  • echart单系列柱状图增加配置筛选legend

    先看整体效果图 这边简单说下实现思路 单列柱子在官网demo是没有legend的 但是多列柱子是有的 因此 我们可以让单列柱子变成多列柱子的集合 然后集合里面只有一列是有data的 相当于是这样的集合 0 1 0 然后使用重叠配置 把那些空
  • 安卓9.0适配方案和踩坑

    年初的时候就已经适配了安卓9 0 但由于业务需求一直没有使用上 前段时间发布了 结果有用户反馈在安卓9 0的手机上更新下载App发生了闪退 这个时候发现9 0对权限 加密和Apache HTTP client发生了相关变化 一 首先我遇到的
  • matlab解决线性规划

    线性规划 线性规划 Linear programming 简称LP 是运筹学中研究较早 发展较快 应用广泛 方法较成熟的一个重要分支 它是辅助人们进行科学管理的一种数学方法 研究线性约束条件下线性目标函数的极值问题的数学理论和方法 英文缩写
  • 数据库间歇性失败 OERR: ORA-12519

    ORA 12519 TNS 没有找到适用的服务处理 OERR ORA 12519 TNS no appropriate service handler found 客户端连接间歇性失败 报错ORA 12519 Oracle客户端与服务器之间
  • select、poll、epoll之间的区别(搜狗面试)(转载)

    1 select gt 时间复杂度O n 它仅仅知道了 有I O事件发生了 却并不知道是哪那几个流 可能有一个 多个 甚至全部 我们只能无差别轮询所有流 找出能读出数据 或者写入数据的流 对他们进行操作 所以select具有O n 的无差别
  • 云服务器文件打包,如何把云服务器的文件打包出来

    如何把云服务器的文件打包出来 内容精选 换一换 文档数据库服务支持开启公网访问功能 通过弹性IP进行访问 您也可通过弹性云服务器的内网访问文档数据库 要将已有的MongoDB数据库迁移到文档数据库 需要先使用mongoexport工具对它做
  • boa的cgi使用总结

    相关配置 配置ScriptAlias 虚拟路径 真实路径 ScriptAlias cgi bin etc boa www cgi bin 指明CGI脚本的虚拟路径对应的实际路径 一般所有的CGI脚本都要放在实际路径里 用户访问执行时输入站点
  • 如何让 uni-app 页面中的背景图片高度和宽度自适应

    如何让 uni app 页面中的背景图片高度和宽度自适应 在今天做项目的时候突然遇到一个问题 我给页面加一个背景图片 但是当页面高度超过100 时 图片会覆盖不到 如图所示 写的代码是这样的 错误的代码 App vue 页面
  • 创建、运行线程,设置线程属性

    Java 9并发编程指南 目录 创建 运行线程 设置线程属性 准备工作 实现过程 工作原理 扩展学习 更多关注 a中有两种方式创建一个线程 继承Thread 类 重写run 方法 创建一个类 实现Runnable接口和run 方法 然后通过
  • 递归算法实现链表两数相加

    LeetCode2题 链表两数相加递归实现 思路 递归 就是在一个方法了不断调用自己 使用递归 明确三点 1 递归终止的条件 2 找返回值 3 本级递归应该做什么 递归只关心本一级需要做什么 而不需要想下一步做什么 即使可能存在很多步 只需
  • leetcode1047——Remove All Adjacent Duplicates In String

    题目大意 一次遍历 删除字符串中所有的相邻重复字符 比如abbaca gt ca 分析 用字符串实现栈 遍历字符串 如果当前字符和栈顶相同就弹栈 否则入栈 代码 class Solution public string removeDupl
  • icmp报文

    一 概述 1 ICMP允许主机或路由报告差错情况和提供有关异常情况 ICMP是因特网的标准协议 但ICMP不是高层协议 而是IP层的协议 通常ICMP报文被IP层或更高层协议 TCP或UDP 使用 一些ICMP报文把差错报文返回给用户进程
  • NDK No implementation found for void com.*

    android jni 遇到报错No implementation found for void com 很多时候遇到这种情况 查找不到原因 还有的时候 之前好好的 后来出错了 再去检查C代码确实有实现的方法 那么问题在哪呢 这边建议去查看
  • css 行高

    1 什么是行高 以及行高的概念 我们可以试想一下 为什么会要有行高 我现在不需要行高不是完全可以的嘛 我们可以仔细看看这个 这不是很正常的嘛 那我们来看看这个 那当我们第一次看到这个的时候你觉得是横着度 还是竖着读 合理的行高可以让我们阅读
  • 打印ONNX/TRT文件的所有节点

    给一段python代码 可以查看 onnx文件的所有节点 import onnx def print graph nodes model path 加载 ONNX 模型 model onnx load model path 遍历所有图节点并
  • 量化策略——准备2 量化技能树&量化术语

    文章目录 量化技能树 量化 金融术语 1 俗语 2 持仓术语 3 资金术语 4 策略术语 5 股票软件界面实用术语 量化必然用到的核心价格数据 其他数据 指标含义 6 委托单术语 量化技能树 首先 量化金融 Quantitative Fin
  • leetcode 有效的括号(栈)

    有效的括号 给定一个只包括 的字符串 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 注意空字符串可被认为是有效字符串 示例 1 输入 输出 true 示例 2 输入 输出 true 示例
  • 前端实现表单嵌套表格,el-form内部包着el-table并实现校验功能与动态添加表格的表单数据

    一 待实现的场景图 如下 二 元素部分实现方式代码如下图