当前位置: 首页 > news >正文

Vue3 Form 表单限制输入小写字母、数字和下划线

方案一:Element Plus 表单验证

<template><el-form :model="form" :rules="rules" ref="formRef" label-width="120px"><el-form-item label="用户名" prop="username"><el-input v-model="form.username" @input="handleUsernameInput"placeholder="只能输入小写字母、数字和下划线"/></el-form-item><el-form-item><el-button type="primary" @click="submitForm">提交</el-button></el-form-item></el-form>
</template><script setup>
import { ref } from 'vue';
import { ElMessage } from 'element-plus';const formRef = ref();
const form = ref({username: ''
});// 实时过滤非法字符
const handleUsernameInput = (value) => {form.value.username = value.replace(/[^a-z0-9_]/g, '');
};// 表单验证规则
const rules = {username: [{ required: true, message: '用户名不能为空', trigger: 'blur' },{ pattern: /^[a-z0-9_]+$/,message: '只能包含小写字母、数字和下划线',trigger: 'blur'},{ min: 4, max: 16, message: '长度应在4-16个字符之间', trigger: 'blur' }]
};const submitForm = () => {formRef.value.validate((valid) => {if (valid) {ElMessage.success('提交成功');console.log('表单数据:', form.value);} else {ElMessage.error('请检查表单输入');}});
};
</script>

方案二:自定义指令实现

<template><el-form :model="form" ref="formRef" label-width="120px"><el-form-item label="用户名"><el-input v-model="form.username" v-lowercase-num-underscoreplaceholder="只能输入小写字母、数字和下划线"/></el-form-item></el-form>
</template><script setup>
// 自定义指令
const vLowercaseNumUnderscore = {mounted(el) {el.addEventListener('input', (e) => {e.target.value = e.target.value.replace(/[^a-z0-9_]/g, '');// 触发v-model更新e.dispatchEvent(new Event('input'));});}
};const form = ref({username: ''
});
</script>

方案三:组合式函数封装

// useInputValidator.js
import { ref } from 'vue';export function useInputValidator() {const inputValue = ref('');const validateInput = (value) => {return /^[a-z0-9_]*$/.test(value);};const filterInput = (value) => {return value.replace(/[^a-z0-9_]/g, '');};return {inputValue,validateInput,filterInput};
}
<template><el-input v-model="filteredValue"placeholder="只能输入小写字母、数字和下划线"/>
</template><script setup>
import { useInputValidator } from './useInputValidator';const { inputValue, filterInput } = useInputValidator();const filteredValue = computed({get: () => inputValue.value,set: (val) => {inputValue.value = filterInput(val);}
});
</script>

高级功能扩展

1. 添加输入提示

<template><el-inputv-model="form.username"@input="handleUsernameInput"placeholder="只能输入小写字母、数字和下划线"><template #append><el-tooltip content="只能包含a-z, 0-9和_" placement="top"><el-icon><QuestionFilled /></el-icon></el-tooltip></template></el-input>
</template>

2. 实时字符计数

<template><el-inputv-model="form.username"@input="handleUsernameInput"maxlength="16"show-word-limit/><div class="counter">已输入: {{ form.username.length }}/16</div>
</template>

3. 禁止粘贴非法字符

const handlePaste = (e) => {e.preventDefault();const text = e.clipboardData.getData('text/plain');const filtered = text.replace(/[^a-z0-9_]/g, '');document.execCommand('insertText', false, filtered);
};

http://www.dtcms.com/a/202817.html

相关文章:

  • 使用VGG-16模型来对海贼王中的角色进行图像分类
  • 同源策略深度防御指南:CSP 高级应用与企业微信全场景适配(含 report-uri 实战)
  • 【产品经理从0到1】用户端产品设计与用户画像
  • 华三(H3C)IRF堆叠心跳的LACP MAD、BFD MAD和ARP MAD差异
  • HJ17 坐标移动【牛客网】
  • C++之set与map介绍
  • 《光与影:33号远征队》栩栩如生的角色动画是如何创建的?
  • vue+springboot+element-ui实现table的树懒加载
  • Redis学习专题(三)主从复制
  • Java大师成长计划之第28天:处理多线程的Web应用
  • python-数据可视化(大数据、数据分析、可视化图像、HTML页面)
  • 生产专属ERP系统源码,一套集成企业财务、供应链、生产、销售等核心业务流程的管理系统
  • 第三十天打卡
  • 【Java高阶面经】1.微服务架构核心:服务注册与发现之AP vs CP选型全攻略
  • 电子电器架构 --- 汽车高性能计算
  • 关于 APK 反编译与重构工具集
  • Spring Boot-Swagger离线文档(插件方式)
  • C++(3)
  • 鸿蒙开发进阶:深入解析ArkTS语言特性与开发范式
  • 关于 Web 漏洞原理与利用:3. CSRF(跨站请求伪造)
  • Python _day31
  • 第40天-Python开发音乐播放器完整指南
  • Java 10IO流
  • [Java] idea的调试介绍
  • P2670 [NOIP 2015 普及组] 扫雷游戏
  • 软件设计师考试三大核心算法考点深度解析(红黑树 / 拓扑排序 / KMP 算法)真题考点分析——求三连
  • centos7配置静态ip 网关 DNS
  • C++中的宏
  • 解码数据语言:如何优雅的进行数仓字典建设?
  • Web开发-Python应用Flask框架Jinja模版绑定路由参数传递页面解析SSTI注入