基于vue封装的正则表达验证

由于公司项目用到的表格比较多,考虑用到了vue+element开发,其中注册的表单填写,以及表格的增删改查用到了比较多的正则验证,element 也有自己封装的必填校验,以及简单的正则,但是这并不能满足我们公司的需求,所以特此封装了自己的插件来调用。

1.首先封装一个js进行囊括正则。

formValidation.js

const formValidation = {
    mobile: (rule, value, callback) => {
        // const reg = /^0?(13[0-9]|15[012356789]|18[0236789]|14[57])[0-9]{8}$/
        const reg = /^1(3|4|5|7|8)\d{9}$/;
        if(!reg.test(value)) {
            callback('请输入正确的手机号')
        }else {
            callback()
        }
    },
    // 邮编验证
    postcode:(rule,value,callback)=>{
        const reg = /^[0-9]{6}$/;
        if(!reg.test(value)){
            callback("请输入正确的手机号")
        }else {
            callback();
        }
    },
    plateNum:(rule, value, callback) => {
        if(value==""||value==undefined){
            callback()
            return false
        }
        // const reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;
     
<think>好的,我现在需要在Vue3中使用正则表达式进行表单验证或数据校验。我之前在Vue2中可能用过类似的技巧,但Vue3的Composition API和新的响应式系统可能有些不同。让我先回忆一下Vue2中的做法,再思考如何迁移到Vue3。 首先,Vue2中常用的表单验证方法是在表单元素上使用v-model绑定数据,然后在提交时通过方法进行验证。例如,用户可能会在methods里定义submitForm方法,调用$refs来触发表单校验,或者直接使用正则表达式进行匹配。比如引用[2]中的例子,他们用正则表达式验证身份证号和手机号,通过test方法检查输入是否符合要求。 在Vue3中,虽然选项式API仍然可用,但Composition API(setup函数)更推荐。那么,如何在这里整合正则表达式验证呢?可能需要使用ref或reactive来创建响应式数据,然后在提交时检查这些数据是否符合正则表达式的要求。 另外,Vue3的表单验证库可能也有变化,比如VeeValidate可能会有更新版本,或者可以使用原生的方式结合正则表达式。不过用户可能希望不用第三方库,直接用原生的方法,这样更轻量。 步骤可能如下: 1. 使用reactive或ref创建表单数据的响应式对象。 2. 在模板中绑定表单输入到这些响应式属性,比如用v-model。 3. 创建验证函数,在函数中使用正则表达式对各个字段进行校验。 4. 在提交表单时调用验证函数,根据结果决定是否继续提交或提示错误。 例如,对于手机号的验证,可以定义类似这样的正则:/^1[3-9]\d{9}$/,然后在验证函数中检查该字段是否匹配这个正则。如果不符合,就显示错误信息。 另外,可能要考虑实时验证,比如在输入时或失去焦点时进行验证,这可以通过@blur事件触发验证函数的部分逻辑。 还需要注意,Vue3中$refs的用法可能有所变化,比如在setup中访问refs需要使用ref变量,或者通过模板引用。不过如果是使用Composition API,可能更倾向于用响应式数据和函数来处理,而不是直接操作DOM元素。 可能还需要处理表单重置的功能,比如在resetForm方法中重置表单数据和错误信息。这时可以用Object.assign或者遍历响应式对象的属性来重置值,并将错误状态清空。 总结一下,可能的实现步骤包括: - 定义响应式表单数据 - 编写正则表达式规则 - 创建验证函数,返回是否通过及错误信息 - 在提交时触发验证,处理结果 - 在模板中显示错误信息 需要确保正则表达式的正确性,例如身份证号的验证可能需要更复杂的正则,考虑15位、18位,以及最后一位可能是X的情况,如引用[2]中的例子。 可能还要考虑将验证逻辑提取为可复用的函数,比如每个字段的验证规则单独写成函数,这样代码更清晰,也便于维护。 最后,可能需要测试不同情况下的输入,确保正则表达式能够正确匹配或拒绝不符合的输入,并处理可能的边缘情况,比如带空格或其他符号的情况是否需要预处理。</think>在Vue3中实现正则表达式验证功能,可以通过以下步骤完成: --- ### 一、基础实现步骤(Composition API) 1. **定义响应式表单数据** ```typescript import { reactive } from 'vue'; const formState = reactive({ phone: '', idCard: '', errors: { phone: '', idCard: '' } }); ``` 2. **编写正则表达式规则** ```typescript const regexRules = { phone: /^1[3-9]\d{9}$/, // 手机号验证 idCard: /(^\d{15}$)|(^\d{17}([\dXx])$)/ // 身份证验证(兼容大小写X) }; ``` 3. **创建验证函数** ```typescript const validateField = (field: keyof typeof regexRules, value: string) => { if (!regexRules[field].test(value)) { formState.errors[field] = `${field}格式错误`; return false; } formState.errors[field] = ''; return true; }; ``` 4. **提交时触发完整验证** ```typescript const handleSubmit = () => { const isPhoneValid = validateField('phone', formState.phone); const isIdCardValid = validateField('idCard', formState.idCard); if (isPhoneValid && isIdCardValid) { // 提交数据逻辑 } }; ``` --- ### 二、模板绑定与错误展示 ```html <template> <form @submit.prevent="handleSubmit"> <!-- 手机号输入 --> <input v-model="formState.phone" @blur="validateField('phone', formState.phone)" placeholder="请输入手机号" > <div class="error">{{ formState.errors.phone }}</div> <!-- 身份证号输入 --> <input v-model="formState.idCard" @blur="validateField('idCard', formState.idCard)" placeholder="请输入身份证号" > <div class="error">{{ formState.errors.idCard }}</div> <button type="submit">提交</button> </form> </template> ``` --- ### 三、进阶优化 1. **封装验证逻辑为可复用Hook** ```typescript // useFormValidation.ts import { reactive } from 'vue'; export function useFormValidation(rules: Record<string, RegExp>) { const form = reactive<{ data: Record<string, string>; errors: Record<string, string> }>({ data: Object.fromEntries(Object.keys(rules).map(k => [k, ''])), errors: Object.fromEntries(Object.keys(rules).map(k => [k, ''])) }); const validate = (field: string) => { if (!rules[field].test(form.data[field])) { form.errors[field] = `${field}格式错误`; return false; } form.errors[field] = ''; return true; }; return { form, validate }; } ``` 2. **调用示例** ```typescript import { useFormValidation } from './useFormValidation'; const { form, validate } = useFormValidation({ phone: /^1[3-9]\d{9}$/, idCard: /(^\d{15}$)|(^\d{17}([\dXx])$)/ }); ``` --- ### 四、对比Vue2的改进点 1. **响应式系统升级** Vue3的`reactive`和`ref`提供更细粒度的响应追踪,避免Vue2中`this.$set`的强制更新操作[^1]。 2. **组合式API优势** 通过`useFormValidation`封装逻辑,实现跨组件复用,解决Vue2中mixins的命名冲突问题[^2]。 --- ### 五、常见问题解决方案 1. **实时验证性能优化** 对输入事件使用防抖: ```typescript import { debounce } from 'lodash-es'; const debouncedValidate = debounce(validateField, 300); ``` 2. **国际化错误提示** 通过注入全局配置: ```typescript const i18nMessages = { en: { phoneError: 'Invalid phone number' }, zh: { phoneError: '手机号格式错误' } }; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值