uni-app表单验证踩坑记:这些坑我替你踩过了 0 次阅读

做过表单的同学都知道,表单验证看似简单,但总有一些意想不到的问题。本文整理了一些实用的表单验证经验,希望能帮你少走弯路。

1. 常见验证踩坑

1.1 手机号验证不全面

问题描述:
很多人只用一个简单的11位数字正则来验证手机号,但实际上这样并不严谨。

解决方案:

  1. 更严谨的手机号验证:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 更完整的手机号验证规则
    const phoneReg = /^1[3-9]\d{9}$/

    // 使用方法
    function validatePhone(phone) {
    if (!phoneReg.test(phone)) {
    uni.showToast({
    title: '请输入正确的手机号',
    icon: 'none'
    })
    return false
    }
    return true
    }

1.2 密码强度验证不够

问题描述:
简单的密码验证容易导致用户设置过于简单的密码。

解决方案:

  1. 添加密码强度检查:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // 密码必须包含数字、字母、特殊字符
    function checkPasswordStrength(password) {
    // 至少8位,包含数字和字母
    const baseReg = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/
    // 增加特殊字符要求
    const strongReg = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$/

    if (!baseReg.test(password)) {
    return {
    valid: false,
    message: '密码至少8位,必须包含数字和字母'
    }
    }

    if (!strongReg.test(password)) {
    return {
    valid: true,
    level: 'normal',
    message: '建议增加特殊字符提高安全性'
    }
    }

    return {
    valid: true,
    level: 'strong',
    message: '密码强度很好'
    }
    }

2. 实时验证问题

2.1 验证频率过高

问题描述:
输入时实时验证,导致频繁提示,影响用户体验。

解决方案:

  1. 使用防抖处理:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let timer = null
    function debounceValidate(value, rule) {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
    // 执行验证
    const result = rule.test(value)
    if (!result) {
    uni.showToast({
    title: '格式不正确',
    icon: 'none'
    })
    }
    }, 500)
    }

2.2 失焦验证时机

问题描述:
在输入框失焦时才验证,但有时用户直接提交表单。

解决方案:

  1. 结合多个验证时机:
    1
    2
    3
    4
    5
    6
    <input 
    v-model="form.phone"
    @input="onPhoneInput"
    @blur="validatePhone"
    placeholder="请输入手机号"
    />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
export default {
methods: {
// 输入时简单验证
onPhoneInput(e) {
const value = e.target.value
// 只允许输入数字
this.form.phone = value.replace(/\D/g, '')
},

// 失焦时完整验证
validatePhone() {
if (!this.form.phone) return
return this.checkPhone(this.form.phone)
},

// 提交时再次验证
submitForm() {
if (!this.validatePhone()) return
// 继续提交流程
}
}
}

3. 特殊场景验证

3.1 身份证号验证

问题描述:
简单的18位验证无法识别假身份证号。

解决方案:

  1. 完整的身份证验证:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function validateIdCard(idCard) {
    // 基本格式验证
    const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
    if (!reg.test(idCard)) return false

    // 验证出生日期
    const year = idCard.substr(6, 4)
    const month = idCard.substr(10, 2)
    const day = idCard.substr(12, 2)
    const date = new Date(year + '-' + month + '-' + day)
    if (date > new Date()) return false

    // 验证校验码(略)
    return true
    }

3.2 金额输入验证

问题描述:
金额输入需要限制小数位数和输入格式。

解决方案:

  1. 金额输入处理:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 限制只能输入数字和小数点,最多两位小数
    function validateAmount(value) {
    // 先去除非数字和小数点
    value = value.replace(/[^\d.]/g, '')
    // 只保留第一个小数点
    value = value.replace(/\.{2,}/g, '.')
    // 保留两位小数
    value = value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2')
    return value
    }

    // 使用示例
    onAmountInput(e) {
    this.form.amount = validateAmount(e.target.value)
    }

4. 表单提交验证

4.1 重复提交问题

问题描述:
用户快速点击提交按钮,导致表单重复提交。

解决方案:

  1. 添加提交锁:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    export default {
    data() {
    return {
    submitting: false
    }
    },
    methods: {
    async submitForm() {
    if (this.submitting) return
    this.submitting = true

    try {
    await this.submit()
    uni.showToast({
    title: '提交成功'
    })
    } catch (e) {
    uni.showToast({
    title: '提交失败',
    icon: 'none'
    })
    } finally {
    this.submitting = false
    }
    }
    }
    }

4.2 必填项检查

问题描述:
提交时才发现有必填项未填写,体验不好。

解决方案:

  1. 实时显示必填状态:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <view class="form-item">
    <text class="label">
    手机号
    <text class="required">*</text>
    </text>
    <input
    v-model="form.phone"
    :class="{'is-error': showError && !form.phone}"
    placeholder="请输入手机号"
    />
    <text v-if="showError && !form.phone" class="error-tip">
    手机号不能为空
    </text>
    </view>

5. 常用验证规则

5.1 常用正则表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const rules = {
// 手机号
phone: /^1[3-9]\d{9}$/,

// 邮箱
email: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,

// 车牌号
carNo: /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/,

// 银行卡号
bankCard: /^([1-9]{1})(\d{15}|\d{18})$/,

// 密码强度
password: /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$/
}

5.2 自定义验证函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const validators = {
// 年龄验证
age(value) {
const age = parseInt(value)
return age >= 0 && age <= 120
},

// 日期验证
date(value) {
return !isNaN(new Date(value).getTime())
},

// 金额验证
amount(value) {
return /^\d+(\.\d{1,2})?$/.test(value)
}
}

6. 最佳实践建议

  1. 合理使用验证时机
  2. 注意验证提示的友好性
  3. 考虑特殊情况处理
  4. 做好防重复提交
  5. 保持代码可维护性

7. 总结

  1. 验证规则要严谨但不过度
  2. 注意用户体验
  3. 考虑各种异常情况
  4. 做好性能优化
  5. 保持代码整洁

如果觉得文章对你有帮助,欢迎点赞、评论、分享,你的支持是我继续创作的动力!

上一篇 uni-app文件上传踩坑记:图片处理和上传全攻略
下一篇 uni-app开发踩坑记录:新手必看的常见问题与解决方案
感谢您的支持!
微信赞赏码 微信赞赏
支付宝赞赏码 支付宝赞赏