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

news2024/11/16 17:47:08

项目为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>

最终样式如下

Ï

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

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

相关文章

IO调度器详解

一、调度器演进 1.1 什么是IO调度器&#xff1f; 传统的磁盘因为有磁头&#xff0c;磁头移动有开销。最早的调度器会对访问磁盘的IO做基于磁盘访问位置的排序和合并&#xff0c; 让磁头以最少的移动来完成最大的IO量&#xff0c; 以提升系统IO带宽。 现在的SSD&#xff0c; 物理…

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

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

NASA数据集——GOES-16卫星的高级图像和地球观测数据

简介 GHRSST NOAA/STAR GOES-16 ABI L2P America Region SST v2.70 dataset in GDS2 ABI_G16-STAR-L2P-v2.70是美国国家航空航天局&#xff08;NASA&#xff09;的一种卫星数据处理产品。这个产品是由GOES-16&#xff08;也称为GOES-East&#xff09;卫星的先进基线/全球地球…

无法设置查询条件,应该如何解决?

使用易查分制作查询系统时&#xff0c;无法正常设置查询条件&#xff0c;应如何解决&#xff1f; &#x1f4cc;问题解决方法 01表格第一行是标题 如果上传的表格&#xff0c;第1行内容是标题而非表头&#xff0c;则易查分系统将无法识别查询条件&#xff0c;需要重新上传第1行…

Spring Cloud微服务在Windows本地开发时禁用Nacos注册中心注册

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 本文将介绍如何在Spring Cloud微服务架构中&#xff0c;实现在Windows本地开发环境下禁用服务自动注册到Nacos注册中心&#xff0…

有点NB的免费wordpress主题模板

一个不错的黄色模板&#xff0c;用WP免费主题模板搭建家政服务公司网站。 https://www.wpniu.com/themes/15.html

【npm】前端工程项目配置文件package.json详解

简言 详细介绍了package.json中每个字段的作用。 package.json 本文档将为您介绍 package.json 文件的所有要求。它必须是实际的 JSON&#xff0c;而不仅仅是 JavaScript 对象文字。 如果你要发布你的项目&#xff0c;这是一个特别重要的文件&#xff0c;其中name和version是…

智能音箱技术解析

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

(七)数据库的安全性

7.1存取控制 7.1.1自主存取控制DAC 7.1.2强制存取控制MAC 7.2审计 其他安全性保护

【字符串】【分类讨论】【KMP】1163. 按字典序排在最后的子串

作者推荐 视频算法专题 本文涉及知识点 字符串 字典序 分类讨论 本题无法使用KMP&#xff0c;因为t1不段变化。 LeetCode1163. 按字典序排在最后的子串 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串。 示例 1&#xf…

关于华为昇腾(Ascend)AI芯片,CANN计算架构,MindSpore深度学习框架,MindStudio开发工具

1、华为昇腾生态 深度学习之前的配置都是&#xff1a;NVIDIA GPU / CPU CUDA Tensorflow/PyTorch 后来老美禁止 NVIDIA 卖GPU芯片给我们&#xff0c;于是国内企业开始发力CPU和GPU硬件&#xff0c;成果丰硕&#xff0c;虽然与NVIDIA顶级GPU还有一些差距&#xff0c;但是也不…

网络故障基本判断方法

1&#xff09;电脑上使用winR键&#xff0c;打开运行窗口&#xff0c;输入CMD命令&#xff0c;点击回车键 2&#xff09;在弹出的CMD运行窗口中输入ipconfig命令 通过该命令可以查看本机的IP地址&#xff0c;子网掩码和网关等信息。确认电脑中所有网卡配置是否正确。 3&…

有点炫酷有点diao的免费wordpress模板主题

这是一款经典的免费wordpress主题&#xff0c;被广泛应用于多个行业的网站。 https://www.wpniu.com/themes/189.html

【linux】04 :linix实用操作

1.常用快捷键 ctrlc表示强制停止。linux某些程序的运行&#xff0c;如果想强制停止&#xff0c;可以使用&#xff1b;命令输入错误&#xff0c;也可以通过ctrlc,退出当前输入&#xff0c;重新输入。 ctrld表示退出登录&#xff0c;比如退出root以回到普通用户&#xff0c;或者…

visual studio 将编译后的dll等文件自动复制到指定目录

编译后的文件dll等总要手动复制到指定目录下&#xff0c;为了解决这一繁琐的操作&#xff0c;可以直接设置在编译完成后&#xff0c;自动复制到目标目录 - 在解决方案资源管理器&#xff0c;选中项目右键-》选中属性-》在弹出的面板选择生成事件 - 在后期生成事件命令行里填写…

IOS降级后从高版本到低版本恢复备份

IOS降级后从高版本到低版本恢复备份 此方法只适用于小版本还原&#xff0c;比如17.4->17.3&#xff0c;未验证大版本恢复可行性手机型号&#xff1a;iphone 13pro 系统版本&#xff1a;17.4 降级版本&#xff1a;17.3.1 步骤 通过itunes或者MacOS系统下对当前版本进行备份…

React-useEffect

1.概念 说明&#xff1a;用于在React组件中创建不是由事件引起而是由渲染本身引起的操作&#xff0c;比如发送 A列AX请求&#xff0c;更改DOM等。 2.案例 // useEffect用于组件不是由事件引起的而是由渲染本身引起的操作&#xff0c;如ajax,更改Dom等。 import { useEffect,…

【MapReduce】03.MapReduce框架原理

目录 1.InputFormat数据输入 1.1.切片与MapTask并行度决定机制 1.2.Job提交流程源码和切片源码 1.3.FileInputFormat切片机制 1.4.TextInputFormat 1.5.CombineTextInputFormat切片机制 1.6.CombineTextInputFormat 1.InputFormat数据输入 1.1.切片与MapTask并行度决定…

小白跟做江科大51单片机之AD/DA

1.看原理图找接口 2.看时序图编写读取数据代码 XPT2046.c代码 #include <REGX52.H> //引脚定义 sbit XPY2046_DINP3^4; sbit XPY2046_CSP3^5; sbit XPY2046_DCLKP3^6; sbit XPY2046_DOUTP3^7; unsigned int XPT2046_ReadAD(unsigned char Command) { unsigned char …

基于SSM的党务政务服务热线平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的党务政务服务热线平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spri…