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

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.mfbz.cn/a/692276.html

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

相关文章

WPF视频学习-基础知识篇

1.简介WPF&#xff1a; C# 一套关于windows界面应用开发框架 2.WPF和winform的差别 &#xff0c;(WPF比较新) 创建新项目使用模板&#xff1a; WPF使用.xaml后缀&#xff0c;双击可查看操作界面和设置代码&#xff0c;其文件展开之后中有MainWindow.xaml.cs为程序交互逻辑。…

1.Vue2使用ElementUI-初识及环境搭建

目录 1.下载nodejs v16.x 2.设置淘宝镜像源 3.安装脚手架 4.创建一个项目 5.项目修改 代码地址&#xff1a;source-code: 源码笔记 1.下载nodejs v16.x 下载地址&#xff1a;Node.js — Download Node.js 2.设置淘宝镜像源 npm config set registry https://registry.…

Python实现连连看9

&#xff08;2&#xff09;标识选中的图片 在判断出玩家选中的是哪一张图片之后&#xff0c;接下来就可以标识选中的图片了&#xff0c;即在该选中的图片外围画矩形。代码如下所示。 FIRSTCLICK True #FIRSTCLICK是全局变量 if(click_col>0 and click_row>0) and \(no…

GUI编程-01

组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 Java提供了丰富的图形用户界面&#xff08;Graphics User Interface&#xff0c;GUI&#xff09;的类库&#xff0c;基于这些类库可以编写窗口程序。 Java关于图形界面的类库主要放在…

uniapp自定义的下面导航

uniapp自定义的下面导航 看看效果图片吧 文章目录 uniapp自定义的下面导航 看看效果图片吧 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6aa0e964741d4dd3a58f4e86c4bf3247.png) 前言一、写组件、我这里就没有写组件了直接写了一个页面&#xff1f;总结 前言 在…

JWT 快速入门

什么是 JWT JSON Web Token&#xff08;JWT&#xff09;是目前最流行的跨域身份验证解决方案 JSON Web Token Introduction - jwt.ioLearn about JSON Web Tokens, what are they, how they work, when and why you should use them.https://jwt.io/introduction 一、常见会…

Vue13-计算属性的简写

一、计算属性的简写 注意&#xff1a; 当计算属性只有get&#xff0c;没有set的时候&#xff0c;才能用简写形式&#xff01;&#xff01;&#xff01;

端午与高考的交汇点:家的温暖与梦想的起点

当端午节的粽香弥漫在街头巷尾&#xff0c;高考的脚步也悄然而至。这两个看似毫无关联的时刻&#xff0c;却在每年的六月&#xff0c;奇妙地交汇在一起&#xff0c;为我们带来了一段特别的记忆。这不仅是家的温暖与梦想的起点相遇的时刻&#xff0c;更是传统文化与现代追求共融…

Rust-06-所有权

所有权&#xff08;系统&#xff09;是 Rust 最为与众不同的特性&#xff0c;它让 Rust 无需垃圾回收即可保障内存安全&#xff0c;下面是所有权以及相关功能&#xff1a;借用&#xff08;borrowing&#xff09;、slice 以及 Rust 如何在内存中布局数据。 通过所有权系统管理内…

Java版工程项目管理平台:以源码驱动,引领工程企业数字化转型

在当今数字化时代&#xff0c;随着企业的扩张和业务的增长&#xff0c;传统的工程项目管理方法已显不足。为了提升管理效率、减轻工作负担、增强信息处理的快速性和精确度&#xff0c;工程企业亟需借助数字化技术进行转型升级。本文将向您展示一款基于Spring Cloud、Spring Boo…

当前主流的App开发技术综述

一、引言 随着移动互联网的蓬勃发展&#xff0c;App&#xff08;应用程序&#xff09;已经成为人们日常生活中不可或缺的一部分。无论是社交、购物、娱乐还是工作学习&#xff0c;App都以其便捷、高效和个性化的特点深受用户喜爱。而在这一过程中&#xff0c;App开发技术也在不…

MFC 教程-文本框失去焦点处理

【1】增加窗口的消息处理函数 void CTESTMFCDlg::OnKillFocus(CWnd* pNewWnd) {//CDialogEx::OnKillFocus(pNewWnd);//首先使用true将数据从控件传入成员变量中UpdateData(true);//校验成员变量m_data中的数据是否符合要求&#xff0c;如果不符合&#xff0c;修改后将它显示在控…

访问网站时IP被阻止?原因及解决方法

在互联网上&#xff0c;用户可能会面临一个令人困扰的问题——当尝试访问某个特定的网站时&#xff0c;却发现自己的IP地址被该网站屏蔽。 IP地址被网站屏蔽是一个相对常见的现象&#xff0c;而导致这种情况的原因多种多样&#xff0c;包括恶意行为、违规访问等。本文将解释IP地…

转让北京公司带旅行许可证流程和要求

旅行社是开展旅游服务业务的专项经济主体&#xff0c;旅行社开展相关业务必须持有旅行社业务经营许可证。该资质又分为国内旅行社经营许可证和出境旅行社经营许可证。主要区别在于能否开展出境旅游业务&#xff0c;下面老耿带大家了解&#xff0c;新成立国内旅行社要求及出境旅…

Git之解决重复输入用户名和密码(三十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【CS.CN】深入探讨下HTTP的Connection头:通过keep-alive实现高效网络连接

文章目录 0 序言0.1 由来0.2 使用场景0.3 现在还需要吗&#xff1f; 1 Connection: keep-alive的机制2 语法 && 通过设置Connection: keep-alive优化性能3 验证与性能提升4 总结References 0 序言 0.1 由来 Connection头部字段在HTTP/1.1中被引入&#xff0c;主要用于…

React的useState的基础使用

import {useState} from react // 1.调用useState添加状态变量 // count 是新增的状态变量 // setCount 修改状态变量的方法 // 2.添加点击事件回调 // userState实现计数实例import {useState} from react// 使用组件 function App() {// 1.调用useState添加状态变量// coun…

ChatTTS增强版V2,批量导出srt,语速控制,情感控制,支持朗读数字,问题修复

ChatTTS增强版最新版本已经发布&#xff0c;本次更新我主要增加了多文本批量、SRT导出、语速控制、情感控制、停顿控制等新功能&#xff0c;并针对上一版本中存在的数字读音异常、随机uv_break等问题进行了修复。 视频版本 【ChatTTS增强版V2&#xff0c;批量导出srt&#xff…

基于C#的计算机与安捷伦34970A通信方法

概述 安捷伦34970A采集数据&#xff0c;34970A支持RS232接口&#xff0c;但是如果直接用winform自带的seriaport类基本是没必要使用的&#xff0c;安捷伦等仪表通讯需要用到VISA的库。 库的获取 1. 是德科技的IO Library. 2. NI下载NI-VISA. 两者用法接近. 代码如下 using…

数据库安全加固与API防护策略

在数字化时代&#xff0c;数据库作为企业核心资产的安全性至关重要。然而&#xff0c;随着网络攻击手段的不断演进&#xff0c;数据库和API接口成为了黑客的主要攻击目标。本文将探讨数据库被攻击、API接口被滥用的情况&#xff0c;并提供一系列实用的防护措施&#xff0c;旨在…