惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Application and Cybersecurity Blog
Application and Cybersecurity Blog
A
About on SuperTechFans
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Help Net Security
Help Net Security
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
O
OpenAI News
美团技术团队
月光博客
月光博客
Apple Machine Learning Research
Apple Machine Learning Research
Schneier on Security
Schneier on Security
Webroot Blog
Webroot Blog
Cyberwarzone
Cyberwarzone
Hacker News - Newest:
Hacker News - Newest: "LLM"
Google Online Security Blog
Google Online Security Blog
T
Tenable Blog
S
Security Affairs
博客园_首页
S
Schneier on Security
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
Spread Privacy
Spread Privacy
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
K
Kaspersky official blog
Hugging Face - Blog
Hugging Face - Blog
TaoSecurity Blog
TaoSecurity Blog
博客园 - 聂微东
Vercel News
Vercel News
M
MIT News - Artificial intelligence
T
Troy Hunt's Blog
B
Blog
MongoDB | Blog
MongoDB | Blog
Martin Fowler
Martin Fowler
Attack and Defense Labs
Attack and Defense Labs
L
LINUX DO - 最新话题
D
DataBreaches.Net
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - Franky
W
WeLiveSecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Fortinet All Blogs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Check Point Blog
H
Hacker News: Front Page

吖远zzyの博客

记录一下豆包视频去水印的研究过程,以及fallback_api加密数据qAAB开头数据的解密。 | 吖远zzyの博客 解决华为开发者工具 DevEco Studio 登录跳转 localhost:10101 端口被阻止问题 | 吖远zzyの博客 微信小程序个人资质审核血泪史:踩坑,从反复被拒到神奇过审 | 吖远zzyの博客 如何实现公众号自动回复或做一个短视频无水印解析机器人? | 吖远zzyの博客 以后在手机上用 Termux 和 GitHub Actions 更新 Hexo 博客 | 吖远zzyの博客 必备!这款万能小程序能给抖音/豆包视频图集去除水印、还有有趣的测反应、玩成语模拟工具。 自制的一些免费API接口第二弹(获取QQ昵称、头像、抖音/豆包视频去水印等...) 告别原生导航栏:微信小程序自定义导航栏完美适配方案 在安卓手机上运行OpenClaw?当然可以,用Termux折腾OpenClaw安装QQ机器人的踩坑记录... | 吖远zzyの博客 个人开发工具之抖音直播录制工具:一款功能强大的Android直播录制应用 UniApp中Canvas绘图的易错点与踩坑指南 QQ频道机器人与UniApp开发:常见踩坑点与解决方案 UniApp中Canvas绘图不显示的常见问题与解决方案 Hexo博客实现随机文章功能的完整教程 QQ频道机器人Android客户端使用指南 | 吖远zzyの博客 安卓版QQ频道机器人APP客户端插件开发指南 | 吖远zzyの博客 2024年AI编程助手深度评测:哪款最适合你? uni-app地图定位踩坑记:地图功能和定位的那些坑 uni-app文件上传踩坑记:图片处理和上传全攻略 uni-app开发踩坑记录:新手必看的常见问题与解决方案 uni-app安全防护指南:构建可靠的跨端应用 uni-app性能优化指南:从加载到渲染的全方位提升 uni-app动画效果实战:从基础到高级的动画实现指南 uni-app组件开发实战:从基础到进阶的最佳实践 uni-app网络请求与缓存策略:构建高效的数据层 uni-app状态管理进阶:Vuex最佳实践与性能优化 uni-app路由与页面跳转:最佳实践与踩坑指南
uni-app表单验证踩坑记:这些坑我替你踩过了
吖远zzy · 2024-05-10 · via 吖远zzyの博客
  1. 1. 1. 常见验证踩坑
    1. 1.1. 1.1 手机号验证不全面
    2. 1.2. 1.2 密码强度验证不够
  2. 2. 2. 实时验证问题
    1. 2.1. 2.1 验证频率过高
    2. 2.2. 2.2 失焦验证时机
  3. 3. 3. 特殊场景验证
    1. 3.1. 3.1 身份证号验证
    2. 3.2. 3.2 金额输入验证
  4. 4. 4. 表单提交验证
    1. 4.1. 4.1 重复提交问题
    2. 4.2. 4.2 必填项检查
  5. 5. 5. 常用验证规则
    1. 5.1. 5.1 常用正则表达式
    2. 5.2. 5.2 自定义验证函数
  6. 6. 6. 最佳实践建议
  7. 7. 7. 总结

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. 保持代码整洁

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