news 2026/4/18 1:55:29

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/4/11 5:59:41

3分钟搞定:Bililive-go直播录制入门指南

想要不错过任何一场精彩直播&#xff1f;Bililive-go作为一款专业的直播录制工具&#xff0c;能够帮你自动录制抖音、B站、斗鱼等主流平台的直播内容。这款工具支持多平台兼容和自动化录制&#xff0c;让新手也能轻松上手。 【免费下载链接】bililive-go 一个直播录制工具 项…

作者头像 李华
网站建设 2026/4/17 19:22:40

腾讯混元A13B大模型完整指南:如何在个人电脑上运行800亿参数AI

腾讯混元A13B大模型完整指南&#xff1a;如何在个人电脑上运行800亿参数AI 【免费下载链接】Hunyuan-A13B-Instruct-FP8 腾讯混元A13B大模型开源FP8量化版本&#xff0c;基于高效混合专家架构&#xff0c;仅激活130亿参数即实现800亿级模型性能。支持256K超长上下文与双模式推理…

作者头像 李华
网站建设 2026/4/17 23:06:26

PyWebIO表单实战:3个技巧让你的Python项目秒变交互式Web应用

第一章&#xff1a;PyWebIO 表单快速构建的核心价值PyWebIO 是一个轻量级 Python 库&#xff0c;允许开发者以纯代码方式快速构建交互式 Web 表单界面&#xff0c;而无需编写前端代码。其核心价值在于将数据采集与用户交互逻辑从复杂的前后端分离架构中解放出来&#xff0c;特别…

作者头像 李华
网站建设 2026/4/15 13:34:14

四大物理引擎深度评测:哪个才是你的最佳选择?

四大物理引擎深度评测&#xff1a;哪个才是你的最佳选择&#xff1f; 【免费下载链接】PhysX NVIDIA PhysX SDK 项目地址: https://gitcode.com/GitHub_Trending/phy/PhysX 在游戏开发和仿真模拟领域&#xff0c;物理引擎扮演着至关重要的角色。NVIDIA PhysX作为业界领先…

作者头像 李华
网站建设 2026/4/13 17:34:01

揭秘Python 3.13类型系统升级:这些增强你必须立刻掌握

第一章&#xff1a;Python 3.13类型系统升级概览Python 3.13 在类型系统方面引入了多项重要改进&#xff0c;显著增强了静态类型检查的能力和开发体验。这些更新不仅提升了类型推断的准确性&#xff0c;还为大型项目提供了更强的可维护性支持。更严格的类型检查模式 Python 3.1…

作者头像 李华
网站建设 2026/4/17 21:16:55

从零到一:uni-ui组件库终极使用指南

从零到一&#xff1a;uni-ui组件库终极使用指南 【免费下载链接】uni-ui 基于uni-app的、全端兼容的、高性能UI框架 项目地址: https://gitcode.com/dcloud/uni-ui 开篇&#xff1a;为什么选择uni-ui&#xff1f; 在当今多端开发的时代&#xff0c;uni-ui作为基于uni-a…

作者头像 李华