做过表单的同学都知道,表单验证看似简单,但总有一些意想不到的问题。本文整理了一些实用的表单验证经验,希望能帮你少走弯路。
1. 常见验证踩坑
1.1 手机号验证不全面
问题描述:
很多人只用一个简单的11位数字正则来验证手机号,但实际上这样并不严谨。
解决方案:
- 更严谨的手机号验证:
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
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
2
3
4
5
6
7
8
9
10
11
12
13
14let 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
2
3
4
5
6<input
v-model="form.phone"
@input="onPhoneInput"
@blur="validatePhone"
placeholder="请输入手机号"
/>
1 | export default { |
3. 特殊场景验证
3.1 身份证号验证
问题描述:
简单的18位验证无法识别假身份证号。
解决方案:
- 完整的身份证验证:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function 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
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
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
27export 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
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 | const rules = { |
5.2 自定义验证函数
1 | const validators = { |
6. 最佳实践建议
- 合理使用验证时机
- 注意验证提示的友好性
- 考虑特殊情况处理
- 做好防重复提交
- 保持代码可维护性
7. 总结
- 验证规则要严谨但不过度
- 注意用户体验
- 考虑各种异常情况
- 做好性能优化
- 保持代码整洁
如果觉得文章对你有帮助,欢迎点赞、评论、分享,你的支持是我继续创作的动力!