当前位置: 首页 > 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);
};

相关文章:

  • 使用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(跨站请求伪造)
  • 哪都“差一点”的《歌手2025》,还能爆吗?
  • 竞彩湃|水晶宫夺冠后乘胜追击,四大皆空曼城人间清醒?
  • 90后青年学者李海增逝世9个月后文章登上顶刊,同仁缅怀其贡献
  • 以色列总理:以哈谈判内容包括“结束战争的框架”
  • 以色列在加沙发起新一轮强攻,同步与哈马斯展开无条件谈判
  • 打击网络侵权盗版!四部门联合启动“剑网2025”专项行动