news 2026/5/8 0:31:11

Vue—— Vue 3 + Element Plus 表单输入校验和自动格式化工具函数详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue—— Vue 3 + Element Plus 表单输入校验和自动格式化工具函数详解

在前端开发中,表单输入校验和格式化是一个常见但繁琐的任务。本文介绍一套完整的表单输入校验和自动格式化工具函数,帮助开发者提升用户体验并减少重复代码。

技术难点

  1. 如何自动为表单元素添加合适的属性(如最大长度、占位符等)
  2. 实现通用的数据校验机制,支持多种数据类型
  3. 动态监听 DOM 变化,为新添加的元素自动应用规则
  4. 实时显示校验错误信息并高亮错误字段

实现效果

  • 自动为不同类型的输入框添加默认属性
  • 实时校验用户输入并给出友好提示
  • 支持自定义校验规则
  • 无需手动为每个表单元素添加校验逻辑

示例演示

下面是一套完整的表单输入校验和格式化工具函数:

// 表单校验规则定义constvalidationRules={// 手机号码校验phone:{pattern:/^1[3-9]\d{9}$/,message:'请输入正确的手机号码'},// 邮箱校验email:{pattern:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,message:'请输入正确的邮箱地址'},// 用户名校验(4-16位字母、数字、下划线)username:{pattern:/^[a-zA-Z0-9_]{4,16}$/,message:'用户名必须是4-16位字母、数字或下划线'}};/** * 为输入元素设置默认属性 * @param {HTMLElement} element - 表单元素 */functionsetInputDefaults(element){consttagName=element.tagName.toLowerCase();consttype=element.type;// 已经处理过的元素跳过if(element._processed)return;if(tagName==='input'){// 为文本输入框添加默认最大长度和占位符if(type==='text'&&!element.hasAttribute('maxlength')){element.setAttribute('maxlength','100');if(!element.hasAttribute('placeholder')){element.setAttribute('placeholder','请输入内容');}}// 为数字输入框添加最大值限制if(type==='number'&&!element.hasAttribute('max')){element.setAttribute('max','999999999');}}if(tagName==='textarea'&&!element.hasAttribute('maxlength')){element.setAttribute('maxlength','500');element.setAttribute('rows','4');if(!element.hasAttribute('placeholder')){element.setAttribute('placeholder','请输入内容');}}// 标记为已处理element._processed=true;}/** * 显示校验错误信息 * @param {HTMLElement} element - 表单元素 * @param {string} message - 错误信息 */functionshowValidationError(element,message){// 移除已有错误提示removeValidationError(element);// 创建错误提示元素consterrorDiv=document.createElement('div');errorDiv.className='validation-error';errorDiv.textContent=message;errorDiv.style.cssText=`color: #ff4d4f; font-size: 12px; margin-top: 4px;`;// 高亮错误字段element.style.borderColor='#ff4d4f';// 插入错误提示element.parentNode.appendChild(errorDiv);element._errorElement=errorDiv;}/** * 移除校验错误信息 * @param {HTMLElement} element - 表单元素 */functionremoveValidationError(element){if(element._errorElement){element._errorElement.remove();element._errorElement=null;element.style.borderColor='';}}/** * 添加输入校验功能 * @param {HTMLElement} element - 表单元素 */functionaddInputValidation(element){constdataType=element.getAttribute('data-type');if(!dataType||!validationRules[dataType])return;// 创建校验处理函数constvalidationHandler=(event)=>{constvalue=event.target.value.trim();// 移除之前错误提示removeValidationError(element);// 空值不校验if(!value)return;construle=validationRules[dataType];if(!rule.pattern.test(value)){showValidationError(element,rule.message);}};// 绑定事件element.addEventListener('blur',validationHandler);element.addEventListener('input',validationHandler);// 保存引用便于清理element._validationHandler=validationHandler;}/** * 初始化表单校验功能 */exportfunctioninitFormValidation(){// 使用 MutationObserver 监听 DOM 变化constobserver=newMutationObserver((mutations)=>{mutations.forEach((mutation)=>{if(mutation.type==='childList'){mutation.addedNodes.forEach((node)=>{if(node.nodeType===Node.ELEMENT_NODE){// 处理新添加的表单元素if(isFormElement(node)){setInputDefaults(node);addInputValidation(node);}// 处理子元素中的表单元素constformElements=node.querySelectorAll?node.querySelectorAll('input, textarea'):[];formElements.forEach((element)=>{setInputDefaults(element);addInputValidation(element);});}});}});});// 开始观察 DOM 变化observer.observe(document.body,{childList:true,subtree:true});// 处理已存在的表单元素functionprocessExistingElements(){constelements=document.querySelectorAll('input, textarea');elements.forEach((element)=>{setInputDefaults(element);addInputValidation(element);});}// 页面加载完成后处理现有元素if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',processExistingElements);}else{processExistingElements();}}/** * 判断是否为表单元素 * @param {HTMLElement} element - 元素 * @returns {boolean} */functionisFormElement(element){consttagName=element.tagName.toLowerCase();returntagName==='input'||tagName==='textarea';}

解决方案

这套工具函数的核心思想是:

  1. 自动属性设置:通过 [setInputDefaults](file:///E:/project/front/src/utils/global-util.js#L43-L87) 函数为不同类型的表单元素自动添加合适的默认属性,如最大长度、占位符等。

  2. 灵活校验规则:通过 [validationRules](file:///E:/project/front/src/utils/regExp-util.js#L12-L47) 对象定义各种校验规则,支持扩展自定义规则。

  3. 实时校验反馈:通过 [addInputValidation](file:///E:/project/front/src/utils/global-util.js#L122-L172) 函数为表单元素添加失焦和输入事件监听器,实现实时校验。

  4. 动态元素支持:使用 [MutationObserver](file:///E:/project/front/src/utils/global-util.js#L243-L294) 监听 DOM 变化,为动态添加的表单元素自动应用校验规则。

  5. 友好的错误提示:通过 [showValidationError](file:///E:/project/front/src/utils/global-util.js#L179-L202) 和 [removeValidationError](file:///E:/project/front/src/utils/global-util.js#L209-L221) 函数提供直观的错误提示和视觉反馈。

使用方式非常简单,只需在应用初始化时调用 [initFormValidation()](file:///E:/project/front/src/utils/global-util.js#L342-L375) 函数,并在需要校验的表单元素上添加data-type属性:

<inputtype="text"data-type="phone"/><inputtype="text"data-type="email"/><textareadata-type="username"></textarea>

这样就能自动获得完整的表单校验和格式化功能,大大减少了手动编写校验逻辑的工作量。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 5:10:22

BKA-Transformer-GRU黑翅鸢优化算法多变量时间序列预测Matlab实现

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

作者头像 李华
网站建设 2026/5/6 3:51:35

VoxCPM-1.5-TTS-WEB-UI支持语音合成任务依赖图谱展示

VoxCPM-1.5-TTS-WEB-UI&#xff1a;让语音合成更透明、更易用 在智能语音应用日益普及的今天&#xff0c;我们早已习惯了手机助手流畅地朗读消息、导航系统自然地播报路线&#xff0c;甚至虚拟主播用富有情感的声音进行直播。但你是否想过&#xff0c;这些“会说话”的AI背后&a…

作者头像 李华
网站建设 2026/5/5 1:26:53

HTML5技术演示项目:探索Web开发的无限可能

HTML5技术演示项目&#xff1a;探索Web开发的无限可能 【免费下载链接】html5demos Collection of hacks and demos showing capability of HTML5 apps 项目地址: https://gitcode.com/gh_mirrors/ht/html5demos HTML5技术演示项目作为Web开发实践的重要资源库&#xff…

作者头像 李华
网站建设 2026/4/25 14:41:11

为什么说这本Java教材能让编程新手少走3年弯路?

为什么说这本Java教材能让编程新手少走3年弯路&#xff1f; 【免费下载链接】Java程序设计基础第3版PDF下载分享 Java程序设计基础 第3版 PDF 下载本仓库提供《Java程序设计基础 第3版》PDF版本的下载资源 项目地址: https://gitcode.com/Resource-Bundle-Collection/7930d …

作者头像 李华
网站建设 2026/5/4 2:13:18

VoxCPM-1.5-TTS-WEB-UI语音合成支持自定义词典修正发音

VoxCPM-1.5-TTS-WEB-UI&#xff1a;如何让AI语音真正“说对话” 在智能客服念错客户姓名、导航系统把“重”庆读成“重复”的今天&#xff0c;我们对语音合成的期待早已不止于“能出声”。真正的挑战在于——它能不能准确地表达专业术语&#xff1f;会不会把“华为”念成“华伟…

作者头像 李华
网站建设 2026/5/1 16:01:46

上位机是什么意思?手把手了解其数据交互流程

上位机是什么&#xff1f;一文讲透它如何与下位机“对话”你有没有遇到过这样的场景&#xff1a;一个工厂车间里&#xff0c;几十台设备在运转&#xff0c;而工程师坐在电脑前&#xff0c;轻点鼠标就能看到每台机器的温度、电流、运行状态&#xff0c;甚至远程启动或停机&#…

作者头像 李华