前端实现表单嵌套表格,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并实现校验功能与动态添加表格的表单数据 的相关文章

  • 命名和配置jsfiddle

    对于任何知道答案的人来说 这听起来都是一个非常愚蠢的问题 当我创建 JSfiddle 时 它 会出现在我的列表页面上 如下所示 cGzCe Revision 8 然后我将其命名为 多创建节点 由于添加了修订号 因此该短语中没有空格 所以有额
  • 之后的脚本会阻止 DOM 加载

    考虑以下代码 div class box div 令我惊讶的是 DOM 延迟了十秒的加载 10秒后出
  • 如何使用 Angular 1.5 中的组件为每个页面设置标题

    我最近开始使用 Angular 1 5 组件 我的应用程序中有多个页面 所以我决定创建一个
  • Mat select - 获取selectionChange的旧值

    我有一个项目 其中有一个包含以下内容的表单mat select选择器 每当用户更改输入时 我都会向用户显示一个对话框来确认此操作 现在 The selectionChange 通知值何时更改并将新值传递为 event 当用户取消对话框时 有
  • 考虑使用“jsdom”测试环境

    我有这个简单的测试 import React from react import render from testing library react import Button from describe Button gt it rend
  • div 准备好后如何调用函数?

    我的 javascript 文件中有以下内容 var divId divIDer jQuery divId ready function createGrid Adds a grid to the html html 看起来像这样 div
  • ES6 在defineAsyncComponent 中命名导入

    我想异步加载我的网络应用程序的一些元素 这是旧的导入 import Popover PopoverButton PopoverPanel from headlessui vue export default components Popov
  • innerText 和 html 之间的区别

    有什么区别innerText text and html innerText or text http docs jquery com Attributes text如果您使用的是 jQuery 不包含任何 HTML 标签 因此 如果您有一
  • 对 UPDATE 行的 POST 请求

    我是 javascript 的新手 所以我正在寻找一些帮助来创建一种拖放地理编码标记的方法 以允许交互式更改地址 我相信通过更新 LOCATION 列行可以实现这一点 第一步是 发送 POST 请求 对吧 好吧 所以我想问是否有人可以给我看
  • Vue: vue-i18n: 无法翻译 keypath 的值,使用 keypath 的值作为默认值

    我正在使用 Vue 我想展示三种语言 英语 他加禄语和宿务语 现在我有错误 无法转换键路径 NavbarMobile home 的值 使用 keypath 的值作为默认值 我通过 console log this i18n locale 检
  • jQuery/JavaScript“this”指针混淆

    当函数时 this 的行为bar被称为让我困惑 请参阅下面的代码 当从单击处理程序调用 bar 时 有什么方法可以将 this 安排为普通的旧 js 对象实例 而不是 html 元素 a class with a method functi
  • xhr 响应 for 循环不起作用

    我有 xhr 和 for 循环 它的工作非常罕见 for var i 0 i lt this files length i var xhr new XMLHttpRequest xhr upload onprogress function
  • 禁用 HTML 验证。如何为全局每个表单设置“novalidate”?

    我想知道是否可以做一些事情来禁用应用程序中每个表单的 HTML 验证 有什么办法可以做到这一点或者我应该添加novalidate每个表单标签的属性 看来唯一的方法是添加novalidate使用 JavaScript jQuery 为每个表单
  • 以编程方式将子节点添加到 jstree

    我正在尝试编写一些动态添加节点到 jstree 的代码 我已经关注了医生http www jstree com documentation crrm http www jstree com documentation crrm但无法获得一个
  • 使用 Javascript 从 HTML 表格输入单元格获取值

    我使用 Javascript 动态创建了一个 HTML 表 其中第一列由文本字段组成 第二列由输入字段组成 第三列由文本字段组成 效果很好 nrOfRows document getElementById myId value get nr
  • 为什么间接更改复选框时不会触发复选框上的 onchange

    我使用 Prototype 来监视复选框 因此我可以向它们添加 javascript 检查 当单击复选框所在的 tr 或 td 时 应选中该复选框 当您直接单击复选框时 会触发 onchange 事件 因此您会收到警报 当 javascri
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • Tizen SDK:找不到变量:tizen

    我正在尝试使用 Tizen SDK 创建一个 Web 应用程序 当我启动应用程序时 一切都很好 但是当我在模拟器上按 后退 按钮时 没有任何反应 并且我看到一条消息 55435 js main js 9 ReferenceError 找不到
  • 阻止 Chrome 扩展程序的 popup.html 自动打开

    我正在创建一个 Chrome 扩展程序 其中包含background html每分钟从 API 请求一次信息的文件 收到信息后 它会发送消息popup html弹出窗口使用 JSON 信息将新的 HTML 元素附加到弹出窗口的主体上 问题是
  • 使用 ASP.Net 和 Ajax 的登录页面

    我正在尝试使用 html ajax 和 ASP NET 制作登录页面 数据确实传递给 ajax 函数 但是当我调试 asp 页面时 用户名和密码以 NULL 发送 该代码应该获取用户名和密码 然后返回用户 ID html页面 div Use

随机推荐

  • 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并实现校验功能与动态添加表格的表单数据

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