el-table-column嵌套el-form-item不能进行校验问题解决

项目为vue3+elementPlus开发的项目

业务要求:table表格展示数据,其中有一行是ip地址可展示可修改,此处要求增加自定义校验规则

先看一下效果:

此处先描述一下,问题出在了哪里,我将el-table的data,使用一个ref数组存储,表格校验使用了一个对象存储,导致,校验的时候拿不到数据,代码如下

<template>
<el-form ref="ruleFormRef" :model="form" :rules="probeIpFormRules">
<el-table
     :data="tableData"
     empty-text="暂无数据"
      height="calc(100% - 40px)"
      :border="true"
      style="width: 100%"
      v-loading="loading"
      element-loading-background="rgba(255, 255, 255, 0.5)"
      >
          <el-table-column type="index" label="序号" width="60" />
          <el-table-column prop="portName" min-width="190" label="端口号" />
          <el-table-column prop="probeIp" min-width="160" label="探针IP">
            <template #default="{ row, $index }">
              <el-form-item :prop="`tableData[${$index}].probeIp`" :rules="probeIpFormRules.probeIp">
                <el-input class="probeIp-style" v-model.trim="row.probeIp" autocomplete="off" clearable />
              </el-form-item>
            </template>
          </el-table-column>
        </el-table>
        </el-form>
</template>
<script setup lang="ts">
 const  probeIpFormRules= {
    probeIp: [{ required: false, message: '请输入ip地址', trigger: 'change' }, { validator: checkIp }],
  }
const tableData=ref([])
</script>

以下是正确代码,就是将tableData和probeIpFormRules放到同一个对象里

<template>
  <el-dialog
    title="设置交换机端口"
    v-model="dialogVisible"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    draggable
    width="90%"
    @closed="handleClose"
  >
    <el-form ref="ruleFormRef" :model="form" :rules="form.probeIpFormRules">
      <div class="box-warp">
        <div class="hd-header">
          <span>交换机ip: {{ switchIp }}</span>
          <div class="hd-btn">
            <el-button type="primary" @click="handleSave(ruleFormRef)" :loading="btnLoading">保存</el-button>
            <el-button @click="handleClose">关闭</el-button>
          </div>
        </div>

        <el-table
          :data="form.tableData"
          empty-text="暂无数据"
          height="calc(100% - 40px)"
          :border="true"
          style="width: 100%"
          v-loading="loading"
          element-loading-background="rgba(255, 255, 255, 0.5)"
        >
          <el-table-column type="index" label="序号" width="60" />
          <el-table-column prop="portName" min-width="190" label="端口号" />
          <el-table-column prop="portDes" min-width="200" label="端口描述" />
          <el-table-column prop="portRunningStatus" min-width="90">
            <template #header>
              <el-tooltip :visible="tooltipVisible" placement="top">
                <template #content>
                  <span>端口状态改变后请等待1分钟刷新查看</span>
                </template>
                <div class="status-style" @mouseenter="tooltipVisible = true" @mouseleave="tooltipVisible = false">
                  <span>当前端口状态</span>
                  <el-icon><QuestionFilled /></el-icon>
                </div>
              </el-tooltip>
            </template>
            <template #default="{ row }">
              <el-tag :type="showStatus(row.portRunningStatus)">
                {{ filterStatus(row.portRunningStatus) }}
              </el-tag>
            </template>
          </el-table-column>
          <el-table-column prop="nominalBandwidth" min-width="100" label="额定带宽(Mb)">
            <template #default="{ row }">
              <el-input-number
                v-model="row.nominalBandwidth"
                :controls="false"
                :step="1"
                :min="0"
                :max="9999"
                :precision="0"
                style="width: 100%"
              />
            </template>
          </el-table-column>
          <el-table-column prop="probeName" min-width="190" label="探针名称">
            <template #default="{ row }">
              <el-input v-model.trim="row.probeName" maxlength="30" autocomplete="off" />
            </template>
          </el-table-column>
          <el-table-column prop="probeIp" min-width="160" label="探针IP">
            <template #default="{ row, $index }">
              <el-form-item :prop="`tableData[${$index}].probeIp`" :rules="form.probeIpFormRules.probeIp">
                <el-input class="probeIp-style" v-model.trim="row.probeIp" autocomplete="off" clearable />
              </el-form-item>
            </template>
          </el-table-column>
          <el-table-column label="端口操作" fixed="right" width="140">
            <template #default="{ row }">
              <el-switch
                v-model="row.portChangeStatus"
                :active-value="1"
                :inactive-value="2"
                active-text="ON"
                inactive-text="OFF"
                inline-prompt
                style="--el-switch-on-color: #13ce66; --el-switch-off-color: #f56c6c"
                @change="changevisible"
              />
            </template>
          </el-table-column>
        </el-table>
      </div>
    </el-form>
  </el-dialog>
</template>
<script setup lang="ts">
import { getPortByIp, savePort } from '@/api/switchModule'
import { validIpC } from '@/utils/validate.js'
const tooltipVisible = ref(false)
const ruleFormRef = ref()
/**
 * 状态显示
 */
const changevisible = () => {
  tooltipVisible.value = true
  const timer = setTimeout(() => {
    tooltipVisible.value = false
    clearTimeout(timer)
  }, 1000)
}
//校验子网地址格式
const checkIp = (rule: any, value: any, callback: any) => {
  if (value?.trim().length === 0) {
    callback(new Error('请输入ip地址'))
  } else if (value && !validIpC(value?.trim())) {
    callback(new Error('请输入正确格式的ip地址'))
  } else {
    callback()
  }
}

const dialogVisible = ref(false)
/**
 * 关闭弹窗
 */
const handleClose = () => {
  dialogVisible.value = false
}
const portStatus: Record<string, { label: string; color: 'success' | 'danger' }> = {
  '1': {
    label: '开启',
    color: 'success',
  },
  '2': {
    label: '关闭',
    color: 'danger',
  },
}
const filterStatus = (status: number) => {
  return portStatus[String(status)].label
}
const showStatus = (status: number) => {
  return portStatus[String(status)].color
}

const switchIp = ref('')
const btnLoading = ref(false)
const form = ref({
  tableData: [],
  probeIpFormRules: {
    probeIp: [{ required: false, message: '请输入ip地址', trigger: 'change' }, { validator: checkIp }],
  },
})

const handleSave = async (formEl: any) => {
  if (!formEl) return
  formEl.validate(async (valid: any) => {
    if (!valid) return
    ElMessageBox.confirm('确定提交端口信息吗?', '提示', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning',
    }).then(async () => {
      btnLoading.value = true
      try {
        const params = {
          switchIp: switchIp.value,
          resSwitchPortEntities: form.value.tableData,
        }
        console.log('请求保存的参数是==》', params)
        const { code, data } = await savePort(params)
        console.log('保存的数值为=》', code, data)
        dialogVisible.value = false
      } catch (error) {
        console.log('保存失败==》', error)
      } finally {
        btnLoading.value = false
      }
    })
  })
}
/**
 * 查询数据
 * @param switchIp
 */
const queryList = async (switchIp: string) => {
  loading.value = true
  try {
    const { code, data } = await getPortByIp({ switchIp })
    if (code !== 200 || data.resSwitchPortEntities.length === 0) return
    form.value.tableData = data.resSwitchPortEntities
  } catch (error) {
    console.log('错误==》', error)
  } finally {
    loading.value = false
  }
}

const openDialog = (ip: string) => {
  switchIp.value = ip
  //通过ip请求数据
  queryList(ip)
  dialogVisible.value = true
}
defineExpose({
  openDialog,
})
// 搜索对象
const searchForm = reactive({
  pageNum: 1,
  pageSize: 100,
  total: 0,
})
// 表格数据
const loading: Ref<boolean> = ref(false)
</script>

<style lang="scss" scoped>
.box-warp {
  height: 70vh;
  :deep(.el-input__wrapper) {
    box-shadow: 0 0 0 0px;
  }
  .hd-header {
    display: flex;
    justify-content: space-between;
    // margin-top: -20px;
    margin-bottom: 20px;
  }
  .probeIp-style{
    margin-top: 18px ;
  }
  .status-style {
    display: flex;
    align-items: center;
    justify-content: center;
  }
}
</style>

最终样式如下

Ï

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

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

相关文章

LabVIEW质谱仪开发与升级

LabVIEW质谱仪开发与升级 随着科技的发展和实验要求的提高&#xff0c;传统基于VB的质谱仪系统已经无法满足当前的高精度和高效率需求。这些系统通常存在着功能不全和操作复杂的问题&#xff0c;影响了科研和生产的进度。为了解决这些问题&#xff0c;开发了一套基于LabVIEW开…

考研复习C语言初阶(3)

目录 一.函数是什么? 二.C语言中函数的分类 2.1库函数 2.2自定义函数 三.函数的参数 3.1实际参数&#xff08;实参&#xff09; 3.2 形式参数&#xff08;形参&#xff09; 四.函数的调用 4.1 传值调用 4.2 传址调用 五. 函数的嵌套调用和链式访问 5.1 嵌套调用 5…

Nginx 基础知识及实例解析

一、简介 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;目前使用最多的就是负载均衡。Nginx 可以作为静态页面的 web 服务器&#xff0c;同时还支持 CGI 协议的动态语言&#xff0c;比如 perl、…

探索考古文字场景,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建文本考古场景下的甲骨文字符图像检测识别系统

甲骨文是一种非常历史悠久的古老文字&#xff0c;在前面我们基本上很少有涉及这块的内容&#xff0c;最近正好在做文字相关的项目开发研究&#xff0c;就想着基于甲骨文的场景来开发对应的检测识别系统&#xff0c;在前文中我们基于YOLOv7开发构建了在仿真数据实验场景下的目标…

Mamba-minimal Mamba的最小限度实现 (一)

文章目录 参数和数据尺寸约定class MambaBlockdef forwarddef __ int__def ssmdef selective_scan johnma2006/mamba-minimal: Simple, minimal implementation of the Mamba SSM in one file of PyTorch. (github.com) manba的简单最小限度实现&#xff0c;和原始论文实现stat…

智能音箱技术解析

目录 前言智能音箱执行步骤解析1.1 探测唤醒词或触发词1.2 语音识别1.3 意图识别1.4 执行指令 2 典型的智能音箱2.1 百度小度音响2.2 小米小爱同学2.3 苹果 HomePod 3 功能应用举例3.1 设置计时器3.2 播放音乐 结语 前言 智能音箱已经成为日常生活中不可或缺的一部分&#xff…

亚信安慧AntDB:为数据安全和稳定而生

AntDB充分考虑了用户的需求&#xff0c;将用户体验置于优先位置&#xff0c;通过深入分析用户的使用情况&#xff0c;对数据库的性能和功能进行了全方位的优化。无论是对于小规模应用还是大规模企业级系统&#xff0c;AntDB都能够提供稳定高效的数据库服务&#xff0c;满足不同…

[BUG] docker运行Java程序时配置代理-Dhttp.proxyHost后启动报错

[BUG] docker运行Java程序时配置代理-Dhttp.proxyHost后启动报错 bug现象描述 版本&#xff1a;2.0.4&#xff08;客户端和服务端都是&#xff09; 环境&#xff1a;私有云环境&#xff0c;只有少量跳板机器可以访问公网&#xff0c;其他机器均通过配置代理方式访问公网 bug现…

新一代 Git 工具,AI 赋能!深度集成、简化操作 | 开源日报 No.194

gitbutlerapp/gitbutler Stars: 7.2k License: NOASSERTION gitbutler 是一个基于 Git 的版本控制客户端。旨在为现代工作流程构建一个全新的 Git 分支管理工具。 虚拟分支&#xff1a;可以同时在多个分支上工作&#xff0c;而无需不断切换分支简化提交管理&#xff1a;通过拖…

码垛【FB块】

转载&#xff1a; FUNCTION BLOCK 码垛 VAR INPUT 当前数:INT; 点l:Point; 点2:Point; X行数:REAL; Y列数:REAL; 2层数:REAL; END VAR VAR OUTPUT 目标点:Point; 点数量:INT; END VAR VAR // X差值:点2.x-点1.x; IF X行数>1 AND X差值<>0 THEN X间隔:X差值/(X行数-1)…

07.axios封装实例

一.简易axios封装-获取省份列表 1. 需求&#xff1a;基于 Promise 和 XHR 封装 myAxios 函数&#xff0c;获取省份列表展示到页面 2. 核心语法&#xff1a; function myAxios(config) {return new Promise((resolve, reject) > {// XHR 请求// 调用成功/失败的处理程序}) …

偶极子和环形天线的辐射机理仿真分析

目录 0 引言 1 偶极子天线的辐射因素分析 1.1 偶极子天线模型设计 1.2 谐振点的出现规律 1.3 天线尺寸对辐射的影响 1.4 天线角度对辐射的影响

c++ primer plus 第十五章笔记 友元,异常和其他

友元类&#xff1a; 两个类不存在继承和包含的关系&#xff0c;但是我想通过一个类的成员函数来修改另一个类的私有成员和保护成员的时候&#xff0c;可以使用友元类。 class A {private:int num;//私有成员//...public: //...friend class B;//声明一个友元类 }class…

ChatGPT Plus 自动扣费失败,如何续订

ChatGPT Plus 自动扣费失败&#xff0c;如何续订 如果您的 ChatGPT Plus 订阅过期或扣费失败&#xff0c;本教程将指导您如何重新订阅。 本周更新 ChatGPT Plus 是一种每月20美元的订阅服务。扣费会自动进行&#xff0c;如果您的账户余额不足&#xff0c;OpenAI 将在一次扣费…

css 背景图片居中显示

background 简写 background: #ffffff url(https://profile-avatar.csdnimg.cn/b9abdd57de464582860bf8ade52373b6_misnice.jpg) center center / 100% no-repeat;效果如图&#xff1a;

git - 笔记

为什么要学习Git 为什么要学习Git软件 为什么学习 因为在主流开发中&#xff0c;基于互联网软件开发的项目都会使用Git软件来进行项目开发过程中的资源管理 比如人力资源 代码资源 比如前端资源 .html .java等代码资源 文档资源 像项目开发中涉及到的需求文档等 这种项目中管理…

CRM术语速览:掌握这十个专业名词,成为CRM专家

无论您是销售人员还是采购经理&#xff0c;熟悉CRM管理系统专业术语都是一门必修课。擅于运用CRM专业术语帮助您理解CRM管理系统的功能、更好的开展业务。本文与您分享不得不知道的十大CRM专业术语&#xff0c;CRM常用术语合集。常见的CRM术语包括MQL、SQL、SDR、销售漏斗等等。…

带摄像头的 AirPods,苹果会怎么做出来?

苹果对智能产品的设计&#xff0c;正在放飞自我。 根爆料&#xff0c;苹果在「未来设备」的规划里&#xff0c;有两个大胆的想法&#xff1a; 一是带有屏幕的 HomePod 正在研发中&#xff0c;当中将集成 Apple TV、FaceTime 等重多功能&#xff1b;二是配备摄像头的 AirPod…

【ARM Trace32(劳特巴赫) 高级篇 21 -- SystemTrace ITM 使用介绍】

文章目录 SystemTrace ITMSystemTrace ITM 常用命令Trace Data AnalysisSystemTrace ITM CoreSight ITM (Instrumentation Trace Macrocell) provides the following information: Address, data value and instruction address for selected data cyclesInterrupt event info…

201909青少年软件编程(Scratch)等级考试试卷(三级)

青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;三级&#xff09;2019年9月 第1题&#xff1a;【 单选题】 执行下面的脚本后&#xff0c;变量“分数”的值是多少&#xff1f;&#xff08;&#xff09; A:5 B:6 C:10 D:25 【正确答案】: C 【试题…