Vue项目-Table添加Form表单校验
一、HTML
<template><div class="taskInfo"><el-form:model="generateParams":rules="formRules"ref="formRef"class="taskInfoForm"label-width="100px"><ul class="taskInfoSearch"><li><el-form-item label="类型" prop="type"><el-selectv-model="generateParams.type"placeholder="请选择类型"><el-option :value="1" label="aaa"></el-option><el-option :value="2" label="bbb"></el-option></el-select></el-form-item></li><li><el-form-item label="开始" prop="start"><el-inputv-model="generateParams.start"placeholder="请输入开始值"></el-input></el-form-item></li><li><el-form-item label="结束" prop="end"><el-inputv-model="generateParams.end"placeholder="请输入结束值"></el-input></el-form-item></li><li><el-form-item label="开始时间" prop="startTime"><el-date-pickerv-model="generateParams.startTime"type="datetime"placeholder="请选择开始时间"format="YYYY/MM/DD hh:mm:ss"value-format="YYYY-MM-DD h:m:s" /></el-form-item></li><li><el-form-item label="结束时间" prop="endTime"><el-date-pickerv-model="generateParams.endTime"type="datetime"placeholder="请选择结束时间"format="YYYY/MM/DD hh:mm:ss"value-format="YYYY-MM-DD h:m:s" /></el-form-item></li></ul><div class="taskInfoAddBtn"><el-button type="primary" @click="addRowData">新增表格数据</el-button></div><div class="taskInfoTab"><el-table:data="generateParams.studentInfo":cell-class-name="cellClassName":row-class-name="rowClassName"@cell-click="cellClick"><el-table-column label="姓名"><template #default="{ row, column }"><el-form-item:prop="'studentInfo.' + row.index + '.name'":rules="formRules.name"v-if="row.index == rowIndex && column.index == columnIndex"><el-inputv-model.number="row.name"type="number"@blur="hideInput"v-focus></el-input></el-form-item><span v-else>{{ row.name }}</span></template></el-table-column><el-table-column label="年龄"><template #default="{ row, column }"><el-form-item:prop="'studentInfo.' + row.index + '.age'":rules="formRules.age"v-if="row.index == rowIndex && column.index == columnIndex"><el-inputv-model.number="row.age"type="number"@blur="hideInput"v-focus></el-input></el-form-item><span v-else>{{ row.age }}</span></template></el-table-column><el-table-column label="性别"><template #default="{ row, column }"><el-form-item:prop="'studentInfo.' + row.index + '.sex'":rules="formRules.sex"v-if="row.index == rowIndex && column.index == columnIndex"><el-inputv-model.number="row.sex"type="number"@blur="hideInput"v-focus></el-input></el-form-item><span v-else>{{ row.sex }}</span></template></el-table-column><el-table-column label="操作" width="100"><template #default="{ row }"><el-button type="danger" link @click="delRowData(row)">删除</el-button></template></el-table-column></el-table></div></el-form><div class="generate"><el-button type="primary" @click="generate(formRef)">任务信息生成</el-button></div><!-- 任务信息生成信息模态框 --><TaskInfoModel ref="TaskInfoModelRef"></TaskInfoModel></div>
</template>
二、JS
<script setup>
// -------------------<<模块引入>>-------------------
import { ref, reactive, onMounted, nextTick } from "vue";
import { ElMessage } from "element-plus";
// -------------------<<变量声明>>-------------------
// 生成参数
const generateParams = reactive({type: 1, // 类型start: 1000000000, // 开始end: 2000000000, // 结束startTime: "2024-08-05 15:33:55", // 开始时间endTime: "2024-08-15 15:33:55", // 结束时间studentInfo: [// 任务区域{name: 123.1122331, // 姓名age: 80.12345621, // 年龄sex: 1200.1, // 性别},{name: 114.1122331, // 姓名age: 80.12345621, // 年龄sex: 1200.1, // 性别},{name: 114.1122331, // 姓名age: 80.12345621, // 年龄sex: 1200.1, // 性别},],
});
// form表单规则
const formRules = reactive({type: [{ required: true, message: "请选择类型", trigger: "change" }],start: [{ required: true, message: "请输入开始", trigger: "blur" }],end: [{ required: true, message: "请输入结束", trigger: "blur" }],startTime: [{ required: true, message: "请选择开始时间", trigger: "change" }],endTime: [{ required: true, message: "请选择结束时间", trigger: "change" }],name: [{ required: true, message: "请输入姓名", trigger: "blur" }],age: [{ required: true, message: "请输入年龄", trigger: "blur" }],sex: [{ required: true, message: "请输入性别", trigger: "blur" }],
});
// 获取form表单ref
const formRef = ref();
// 行列index
const rowIndex = ref(null);
const columnIndex = ref(null);
// 是否允许编辑
const isEdit = ref(true);// -------------------<<函数定义>>-------------------
// 生成
const generate = (formEl) => {if (!formEl) return;formEl.validate((valid) => {if (valid) {console.log(generateParams);TaskInfoModelRef.value.openWin();} else {console.log("error submit!");//当验证失败跳转到空白的所在区域nextTick(() => {let isError = document.getElementsByClassName("is-error");isError[0].scrollIntoView({// 滚动到指定节点// 值有start,center,end,nearestblock: "center",// 值有auto、instant,smooth,缓动动画behavior: "smooth",});});return false;}});
};
// 表格单元格className回调方法
const cellClassName = ({ column, columnIndex }) => {column.index = columnIndex;
};
// 表格行className回调方法
const rowClassName = ({ row, rowIndex }) => {row.index = rowIndex;
};
// 表格单元格点击事件
const cellClick = (row, column) => {if (isEdit.value) {rowIndex.value = row.index;columnIndex.value = column.index;}
};
// input框失去焦点事件
const hideInput = (e) => {if (e.target.value) {rowIndex.value = null;columnIndex.value = null;isEdit.value = true;} else {isEdit.value = false;}
};
// 新增数据
const addRowData = () => {generateParams.studentInfo.push({name: "",age: "",sex: "",});
};
// 删除本行数据
const delRowData = (row) => {if (generateParams.studentInfo.length > 1) {generateParams.studentInfo.splice(row.index, 1);} else {ElMessage.warning("最少保留1条数据");}
};
// -------------------<<函数执行>>-------------------
onMounted(() => {});
</script>
三、CSS
<style lang="less" scoped>
.taskInfo {width: 100%;height: 100%;:deep(.taskInfoForm) {width: 100%;height: calc(100% - 80px);.taskInfoSearch {width: 100%;height: 120px;display: flex;align-items: center;flex-wrap: wrap;li {width: 25%;height: 50%;.el-form-item__label {color: #fff;}.el-form-item {width: 100%;height: 100%;margin-bottom: 0px;display: flex;align-items: center;.el-date-editor.el-input,.el-input,.el-select {width: 100% !important;}}}}.taskInfoAddBtn {width: 100%;height: 50px;display: flex;align-items: center;justify-content: flex-end;}.taskInfoTab {width: 100%;height: calc(100% - 170px);position: relative;.el-table {width: 100%;height: 100%;background: transparent !important;position: absolute;.el-form-item {width: 100%;margin-bottom: 0px;.el-form-item__content {margin-left: 0px !important;display: flex;align-items: center;justify-content: center;.el-input,.el-select {width: 80% !important;}}}td,th {text-align: center;}}}}.generate {width: 100%;height: 80px;display: flex;align-items: center;justify-content: center;}
}
</style>
相关文章:
Vue项目-Table添加Form表单校验
一、HTML <template><div class"taskInfo"><el-form:model"generateParams":rules"formRules"ref"formRef"class"taskInfoForm"label-width"100px"><ul class"taskInfoSearch"&g…...
【iOS】—— 事件传递链和响应者链总结
事件传递链和响应者链总结 1. 事件传递链:事件传递链:传递流程:总结第一响应者: 2. 响应者链响应者链传递流程总结响应者链流程 总结: 之前也学习过这个内容这次在复习的时候,就想着写一下总结:…...
【多线程】初识进程和线程
💐个人主页:初晴~ 📚相关专栏:多线程 / javaEE初阶 前言 在我们之前编写的所有代码,都只能用上一个核心。众所周知,现在大多数CPU都有多个核心,但此时,无论如法优化程序,…...
1DCNN-2DResNet并行故障诊断模型
往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…...
Java设计模式(原型模式)
定义 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。 角色 Prototype(抽象原型角色) ConcretePrototype(具体原型角色) Client(客户端角色 优点 简化对象的创建过程,…...
C/C++ 知识点:typedef 关键字
文章目录 一、typedef 关键字1、 基本用法2、常见用法2.1、为基本数据类型定义别名2.2、为结构体或联合体定义别名2.3、为指针类型定义别名2.4、为复杂模板类型定义别名 3、注意事项4、总结 前言: 在C(以及C语言)中,typedef 关键字…...
【Linux学习】进程间通信之 匿名管道 与 基于管道的进程池
🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🍑进程间通信🐬进程间通信目的 📚管道 📕管道的原理🐧用fork来共享管道原…...
小团队如何选需求管理软件?8款顶级推荐
本文将分享8款适合小团队的需求管理软件:PingCode、Worktile、Tapd、Teambition、禅道、Asana、Jama Connect、Aha!。 在小团队中管理需求时,寻找合适的软件工具常常让人头疼,不同的需求管理软件提供各种功能,但哪些功能真正适合…...
docker操作入门
1.创建镜像,使用当前文件 docker build -t experience . 2.运行容器 docker run -d -p 8501:8501 --name my-running-app my-python-api docker run -p 8508:8508 experience docker run -p 8508:8508 -p 8509:8509 experience 3.查看容器状态 docker ps docker p…...
简单的射箭小游戏网页源码
简单的射箭小游戏网页源码,对准靶心开启你的射击之旅吧 微信扫码免费获取源码...
Python | Leetcode Python题解之第331题验证二叉树的前序序列化
题目: 题解: class Solution:def isValidSerialization(self, preorder: str) -> bool:pre 1for i in preorder.split(,):if i.isdigit():if pre 0:return Falsepre 1else:if pre 0:return Falsepre - 1return pre 0...
0x3 “护网行动”守之道
一、护网防守目标系统 二、护网防守之利器 通过安全流程控制、安全技术保障、安全工具支撑、安全能力提升四个层次全面构成安全防御体系。 安全技术名称解释 IPS(入侵防御系统)WAF(Web应用防火墙)IDS(入侵检测系统&a…...
白骑士的Matlab教学高级篇 3.1 高级编程技术
系列目录 上一篇:白骑士的Matlab教学进阶篇 2.5 Simulink 高级编程技术在MATLAB中扮演着至关重要的角色,帮助用户更高效地编写复杂程序、提高代码的可维护性和可读性。本节将介绍面向对象编程、函数句柄与回调函数、错误处理与调试的相关内容。 面向对…...
haproxy简介与用法
一、负载均衡 1.1、概念: 负载均衡SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统…...
Geoscene Pro的三维
一、场景设置 1.3D视图分为全局场景和局部场景。在Geoscene Pro中,两个场景可以自由切换。 (1)全局场景有固定的坐标系GCS(WGS84、CGCS2000),并在全球比例尺下展示(全球范围)。可以…...
论文阅读 - Scaling Up k-Clique Densest Subgraph Detection | SIGMOD 2023
1. 论文背景 密集子图发现(Densest Subgraph Discovery)是图挖掘领域的一个基础研究方向,并且近年来在多个应用领域得到了广泛研究。特别是在生物学、金融学和社交网络分析等领域,密集子图的发现对理解复杂网络结构和行为具有重要…...
前端框架(三件套)
学习网站 HTML 系列教程(有广告) HTML(超文本标记语言) | MDN (mozilla.org)(英文不太友好) 1.HTML5 & CSS3 1.1HTML5表格 <!DOCTYPE html> <html lang"en"> <head>…...
MemoryCache 缓存 实用
MemoryCache 缓存 实用,相关逻辑代码里已详细注释, 在Java中创建一个单例模式(Singleton Pattern)的MyMemoryCache类,可以采用多种方法,其中最常见的是使用“饿汉式”和“懒汉式”(线程安全和非线程安全&am…...
Java设计模式(命令模式)
定义 将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。 角色 抽象命令类(Command):声明用于执行请求的execute方法,通…...
什么是 CI/CD?
什么是 CI/CD? CI/CD(Continuous Integration/Continuous Deployment)是一种软件开发实践,旨在通过自动化的方式频繁地构建、测试和发布软件。CI/CD 可以显著提高软件交付的速度和质量,使团队能够更快地响应市场变化和…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
