vue2的element的table组件使用form校验

news2025/1/16 2:50:25

1.需求描述

vue2有时候做自增表格el-table,希望能够带一些校验,但又不想手搓校验逻辑,可以借用el-form的校验逻辑。

2.代码处理

1. html

<template>
    <div class="sad-cont">
      <el-form ref="form" :model="form">
        <el-table :data="form.tableData" border size="mini">
          <el-table-column align="center" prop="other" label="名称" width="230">
            <template slot-scope="scope">
              {{ scope.row.min }} ~ {{ scope.row.max }}
            </template>
          </el-table-column>
          <el-table-column align="center" prop="min" label="最小值" width="230">
            <template slot-scope="scope">
              <el-form-item :prop="'tableData.' + scope.$index + '.min'" :rules="ruleForm.min">

                <el-input-number v-model="scope.row.min" placeholder="请输入最小值" controls-position="right" />
                <template slot="error" slot-scope="itemScope">
                  <!-- 自定义错误信息 -->
                  <div v-if="itemScope.error">
                    <el-tooltip :content="itemScope.error" placement="top">
                      <i class="el-icon-warning-outline sad-item-error" />
                    </el-tooltip>
                  </div>
                </template>
              </el-form-item>
            </template>
          </el-table-column>
          <el-table-column align="center" prop="max" label="最大值" width="230">
            <template slot-scope="scope">
              <el-form-item :prop="'tableData.' + scope.$index + '.max'" :rules="ruleForm.max">
                <el-input-number v-model="scope.row.max" placeholder="请输入最大值" controls-position="right" />
                <template slot="error" slot-scope="itemScope">
                  <!-- 自定义错误信息 -->
                  <div v-if="itemScope.error">
                    <el-tooltip :content="itemScope.error" placement="top">
                      <i class="el-icon-warning-outline sad-item-error" />
                    </el-tooltip>
                  </div>
                </template>
              </el-form-item>
            </template>
          </el-table-column>
          <el-table-column fixed="right">
            <template slot="header">
              <div>
                <span>操作</span>
                <el-tooltip content="添加数据" placement="top">
                  <el-button
                    size="mini"
                    icon="el-icon-plus"
                    class="table-icon-style sad-btn2"
                    @click="addRow()"
                  />
                </el-tooltip>

              </div>
            </template>
            <template slot-scope="scope">
              <el-button
                size="mini"
                type="success"
                class="table-icon-style"
                @click="deleteRow(scope.row, scope.$index)"
              >
                删除
              </el-button>
            </template>
          </el-table-column>
        </el-table>
      </el-form>
    

    <div>
      <el-button type="primary" @click="submitData">确 定</el-button>
    </div>
  </div>
</template>

2. js

import { notEmpty, isEmpty } from '@/utils/validate';

export default {
  components: {
  },
  props: {
    //  默认数据
    defaultData: {
      type: Array,
      default() {
        return [];
      }
    }
  },
  data() {
    return {
      form: {
        tableData: []
      },
      rules: {},
      ruleForm: {
        min: [
          { required: true, message: '请输入最小值', trigger: 'blur' },
          { validator: (rule, value, callback) => this.validateValue(rule, value, callback, 'min'), trigger: 'blur' }
        ],
        max: [
          { required: true, message: '请输入最大值', trigger: 'blur' },
          { validator: (rule, value, callback) => this.validateValue(rule, value, callback, 'max'), trigger: 'blur' }
        ]
      }
    };
  },
  created() {
    this.initData();
  },
  methods: {
    notEmpty, isEmpty,

    //  初始化
    initData() {
      const { defaultData, form: { tableData }} = this;
      tableData.push(...defaultData.map(item => {
        return {
          max: item.max,
          min: item.min
        };
      }));
    },

    //  校验数据
    validateValue(rule, value, callback, key) {
      const { form: { tableData }} = this;
      const { field } = rule;
      const fieldKeys = field.split('.');
      const index = fieldKeys[1];
      const data = tableData[index];
      const maxValue = 999999999;
      const minValue = maxValue * -1;

      if (notEmpty(data.max) && notEmpty(data.min)) {
        if (data.max < data.min) {
          const text1 = key === 'max' ? '最大值' : '最小值';
          const text2 = key === 'max' ? '最小值' : '最大值';
          const text3 = key === 'max' ? '小于' : '大于';
          callback(new Error(`${text1}不得${text3}${text2}!`));

          return;
        }
      } else {
        if (key === 'max') {
          if (value * 1 > maxValue) {
            callback(new Error(`最大值不得大于${maxValue}!`));
            return;
          } else { /**/ }
        } else if (key === 'min') {
          if (value * 1 < maxValue) {
            callback(new Error(`最小值不得小于${minValue}!`));
            return;
          } else { /**/ }
        } else { /**/ }
      }

      callback();
    },

    //  导出数据表
    deleteRow(row, index) {
      const { form: { tableData }} = this;
      tableData.splice(index, 1);
    },

    // 添加一行记录
    addRow() {
      const { form } = this;
      form.tableData.push({
        min: 0,
        max: 10
      });
    },

    //  关闭表单
    closeForm() {
      this.$emit('closeForm');
    },

    //  子组件触发form事件
    submitData() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          const { form: { tableData }} = this;
          const obj = {};
          const returnData = [];
          tableData.forEach(item => {
            const { max, min } = item;
            const text = `${min}~${max}`;
            if (!obj[text]) {
              const each = {
                name: text,
                min: min,
                max: max
              };
              obj[text] = each;
              returnData.push(each);
            } else { /**/ }
          });

          this.$emit('submitForm', returnData);
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    }
  }
};

3.样式优化

提示样式必须处理,这样才能在表格内显示正常!!!

.el-form-item{
  margin-bottom: 0;
}
.sad-item-error{
  position: absolute;
  color: #F56C6C;
  top: 0;
  left: 100%;
  line-height: 32px;
}
.sad-cont{
  min-height: 200px;
}
.sad-btn2{
  padding: 2px 5px;
}

3. 效果如下

在这里插入图片描述

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

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

相关文章

小程序跳转1688<web-view>无效后的实现

web-view 跳转方式 1&#xff1a;这种方法需要在微信开发平台 -> 开发管理 -> 业务域名中配置好要跳转的网站域名&#xff1b; 2&#xff1a;基本上跳转的网址是第三方就不可以配置&#xff0c;因为配置需要在这个域名中的根目录上放你的验证文件&#xff1b; <web-v…

爬楼梯——动态规划第一步

本问题其实常规解法可以分成多个子问题&#xff0c;爬第 n 阶楼梯的方法数量&#xff0c;等于两个部分之和 爬上 n−1 阶楼梯的方法数量。因为再爬 1 阶就能到第 n 阶爬上 n−2 阶楼梯的方法数量&#xff0c;因为再爬 2 阶就能到第 n 阶 所以我们得到公式 dp[n] dp[n−1] d…

如何卸载360安全卫士

不用像其他教程那么复杂 这篇教程比较友好 1.打开桌面&#xff0c;右键单击快捷方式 选择“打开文件位置” 2.然后&#xff0c;搜uninst.exe 3.运行 4.选择“继续卸载” 5.选择“下一步” 6.选择 “继续卸载” 7.选择“继续卸载” 8.选择“是” 9.静等卸载 10.把卸载程序关…

Element ui图片上传

前言 对于广大小白来说&#xff0c;图片上传简直是上传难&#xff0c;难于上青天&#xff01;废话不多说&#xff0c;步入正题&#xff0c;您就瞧好吧&#xff01; 步骤一&#xff1a;前端使用element ui组件&#xff08;upload上传&#xff09; 我个人喜欢使用第二个组件&a…

【代码随想录】【算法训练营】【第29天】 [491]非递减子序列 [46]全排列 [47]全排列II

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 29&#xff0c;周三&#xff0c;坚持坚持~ 题目详情 [491] 非递减子序列 题目描述 491 非递减子序列 解题思路 前提&#xff1a;组合子集问题&#xff0c;可能有重复元素&#xff0c;收集条…

web刷题记录(3)

[NISACTF 2022]checkin 简单的get传参,好久没做过这么简单的题了 王德发&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff01;&#xff0c;看了源代码以后&#xff0c;本来以为是js脚本的问题&#xff0c;但是禁用js脚本没用&#xff0c;看了大佬的wp以后…

鸿蒙轻内核M核源码分析系列六 任务及任务调度(3)任务调度模块

调度&#xff0c;Schedule也称为Dispatch&#xff0c;是操作系统的一个重要模块&#xff0c;它负责选择系统要处理的下一个任务。调度模块需要协调处于就绪状态的任务对资源的竞争&#xff0c;按优先级策略从就绪队列中获取高优先级的任务&#xff0c;给予资源使用权。本文我们…

面试题------>MySQL!!!

一、连接查询 ①&#xff1a;左连接left join &#xff08;小表在左&#xff0c;大表在右&#xff09; ②&#xff1a;右连接right join&#xff08;小表在右&#xff0c;大表在左&#xff09; 二、聚合函数 SQL 中提供的聚合函数可以用来统计、求和、求最值等等 COUNT&…

Qt 的 d_ptr (d-pointer) 和 q_ptr (q-pointer)解析;Q_D和Q_Q指针

篇一&#xff1a; Qt之q指针&#xff08;Q_Q&#xff09;d指针&#xff08;Q_D&#xff09;源码剖析---源码面前了无秘密_qtq指针-CSDN博客 通常情况下&#xff0c;与一个类密切相关的数据会被作为数据成员直接定义在该类中。然而&#xff0c;在某些场合下&#xff0c;我们会…

【深入学习Redis丨第二篇】Redis集群部署详解

文章目录 Redis集群部署Redis4 Cluster部署 Redis集群部署 1 Redis各节点部署 使用源码安装各节点&#xff0c;不过与非cluster方式不同的是&#xff0c;配置文件中需启动cluster相关的配置。 因本次为伪分布式部署&#xff0c;生产环境部署时建议至少3台机器部署&#xff0…

公园【百度之星】/图论+dijkstra

公园 图论dijkstra #include<bits/stdc.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pii; vector<ll> v[40005]; //a、b、c分别是小度、度度熊、终点到各个点的最短距离 ll a[40005],b[40005],c[40005],dist[40005],st[40005]; void…

搭建基于Django的博客系统数据库迁移从Sqlite3到MySQL(四)

上一篇&#xff1a;搭建基于Django的博客系统增加广告轮播图&#xff08;三&#xff09; 下一篇&#xff1a;基于Django的博客系统之用HayStack连接elasticsearch增加搜索功能&#xff08;五&#xff09; Sqlite3数据库迁移到MySQL 数据库 迁移原因 Django 的内置数据库 SQL…

阿里云私有CA使用教程

点击免费生成 根CA详情 启用根CA -----BEGIN CERTIFICATE----- MIIDpzCCAogAwIBAgISBZ2QPcfDqvfI8fqoPkOq6AoMA0GCSqGSIb3DQEBCwUA MFwxCzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdiZWlqaW5nMRAwDgYDVQQHDAdiZWlq aW5nMQ0wCwYDVQQKDARDU0REMQ0wCwYDVQQLDARDU0REMQswCQYDVQQDDAJDTjA…

CAM350如何快速删除Gerber文件上的东西?

文章目录 CAM350如何快速删除Gerber文件上的东西?CAM350如何快速保存已经修改的Gerber文件? CAM350如何快速删除Gerber文件上的东西? CAM如何导入Gerber文件见此篇 今天遇上了一个删除Gerber文件上部分字母的任务&#xff0c;CAM350只能一点点删除线的操作把我手指头差点按…

如何令谷歌浏览器搜索时,子页面使用新窗口,而不是迭代打开

1 问题描述 工作相关需要常用谷歌浏览器&#xff0c;但是现在设置就是每次搜索后&#xff0c;点击搜索结果进去之后&#xff0c;都会覆盖掉原来的父页面&#xff0c;也就是如果我看完了这个子页面的内容&#xff0c;关掉的话&#xff0c;我就需要重新google.com来一遍。。。很…

电路分析答疑 1

三要素法求解的时候&#xff0c; 电容先求U&#xff0c;再利用求导求I 电感先求I&#xff0c;再利用求导求U 若I的头上没有点点&#xff0c;那就是求有效值 叠加定理&#xff0c;不要忘记 若电流值或者电压值已经给出来了&#xff0c;那就说明这一定是直流电。 在画画圈的时候…

【Kubernetes】 emptyDir、nfs存储卷 和 PV、PVC

emptyDir存储卷 当pod被分配给节点 容器和容器之间进行共享存储 hostPath nfs共享存储卷 NAS 专业的存储设备&#xff1b;一般是与NFS 搭配&#xff0c;然后共享出去 GFS 自己搭&#xff1b;CEPH(至少要9台) 第三方&#xff1b;NAS 第三方&#xff1b; 云端 oss …

【多模态】34、LLaVA-v1.5 | 微软开源,用极简框架来实现高效的多模态 LMM 模型

文章目录 一、背景二、方法2.1 提升点2.2 训练样本 三、效果3.1 整体效果对比3.2 模型对于 zero-shot 形式的指令的结果生成能力3.3 模型对于 zero-shot 多语言的能力3.4 限制 四、训练4.1 数据4.2 超参 五、评测六、代码 论文&#xff1a;Improved Baselines with Visual Inst…

深入对比:Transformer与RNN的详细解析

在深度学习领域&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;循环神经网络&#xff08;RNN&#xff09;和Transformer模型都扮演着举足轻重的角色。然而&#xff0c;随着技术的不断发展&#xff0c;Transformer模型逐渐崭露头角&#xff0c;成为…

量子加速超级计算简介

本文转载自&#xff1a;量子加速超级计算简介(2024年 3月 13日) By Mark Wolf https://developer.nvidia.cn/zh-cn/blog/an-introduction-to-quantum-accelerated-supercomputing/ 文章目录 一、概述二、量子计算机的构建块&#xff1a;QPU 和量子位三、量子计算硬件和算法四、…