Async-Validator——表单验证的艺术

ops/2024/10/20 13:30:52/

在现代 web 应用开发中,表单验证是一个不可或缺的部分。它确保了用户输入的数据符合预期的格式和规则,从而提高了数据的质量和用户体验。async-validator 是一个强大的 JavaScript 库,它专门用于异步表单验证,被广泛应用于主流 UI 组件库如 Ant Design 和 Element 中。本文将介绍如何使用 async-validator 来实现表单验证,并提供一个实际的案例分析。

什么是 async-validator?

async-validator 是一个基于 JavaScript 的表单验证库,它支持异步验证规则和自定义验证规则。这意味着你可以在验证过程中执行异步操作,比如从服务器检查用户名是否已存在。

为什么选择 async-validator?

  • 异步支持:能够在验证过程中执行异步操作。
  • 自定义验证规则:支持创建自定义验证规则,满足特定的验证需求。
  • 主流 UI 组件库支持:Ant Design 和 Element 等 UI 组件库的表单验证都是基于 async-validator

如何使用 async-validator?

使用步骤:

  1. 安装并在项目中导入 async-validator
  2. 创建验证规则 rules
  3. 创建表单验证实例,将验证规则传递给构造函数,产生实例
  4. 调用实例方法 validate 对数据进行验证
    • 第一个参数:需要验证的数据
    • 第二个参数:回调函数,回调函数有两个参数 errors, fields
      • errors:如果验证成功,返回 null,验证错误,返回数组
      • fields:需要验证的字段,属性值错误数组

安装

首先,你需要安装 async-validator

npm i async-validator

创建验证规则

创建一个包含验证规则的对象,每个字段的规则可以是一个对象,也可以是包含多个规则的对象数组。

创建表单验证实例

使用 async-validator 创建一个验证实例,将定义好的规则对象传递给它。

调用实例方法 validate 对数据进行验证

validate 方法接受两个参数:需要验证的数据和一个回调函数。回调函数有两个参数:errorsfieldserrors 是一个数组,包含所有验证错误;fields 是一个对象,包含每个字段的验证错误数组。

实例代码

以下是使用 async-validator 的示例代码:

// 1️⃣ 引入 async-validator,async-validator 提供了一个构造函数
import Schema from 'async-validator'Page({// 2️⃣定义需要验证的数据data: {name: '你好'},// 验证数据onValidate() {// 3️⃣创建表单验证规则const rules = {// key 建议和 需要验证的数据字段名字保持一致name: [// required 是否是必填项{ required: true, message: 'name 不能为空' },// type 数据的类型// message 如果验证失败,提示的错误内容{ type: 'string', message: 'name 不是字符串' },// min 最少位数,max 最大位数{ min: 2, max: 5, message: '名字最少 2 个字,最多 5 个字' }// 正则表达式// { pattern: '', message: '' }// 自定义验证规则// { validator: () => {} }]}// 4️⃣创建表单验证实例// 在创建实例时需要传入验证规则const validator = new Schema(rules)// 5️⃣ 调用 validate 实例方法对数据进行验证// validate 方法接收一个对象作为参数,对象是需要验证的数据// 注意:validate 方法只会验证和验证规则同名的属性validator.validate(this.data, (errors, fields) => {// 如果验证失败,errors 是所有错误的数组// 如果验证成功,errors 是 nullconsole.log(errors)// fields 是需要验证的属性,属性值是数组,数组中包含错误信息console.log(fields)if (errors) {console.log('验证没有通过')console.log(errors)return}console.log('验证通过')})}
})

新增收货地址表单验证

在点击新增收货地址的时候,我们需要对用户输入的值进行验证。以下是具体的实现步骤和代码:

验证需求

  1. 收货人不能为空,且不能输入特殊字符。
  2. 手机号不能为空,且输入的手机号必须合法。
  3. 省市区不能为空。
  4. 详细地址不能为空。

正则表达式

const nameRegExp = '^[a-zA-Z\\d\\u4e00-\\u9fa5]+$';
const phoneReg = '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$';

实现代码

import Schema from 'async-validator'Page({// coding....// 保存收货地址async saveAddrssForm() {// 组织参数 (完整地址、是否设置为默认地址)const {provinceName,cityName,districtName,address,isDefault} = this.data// 最终需要发送的请求参数const params = {...this.data,fullAddress: provinceName + cityName + districtName + address,isDefault: isDefault ? 1 : 0}// 调用方法对最终的请求参数进行验证const { valid } = await this.validateAddress(params)// 如果验证没有通过,不继续执行后续的逻辑if (!valid) returnconsole.log(params)},// 验证新增收货地址请求参数// 形参 params 是需要验证的数据validateAddress(params) {// 验证收货人,是否只包含大小写字母、数字和中文字符const nameRegExp = '^[a-zA-Z\\d\\u4e00-\\u9fa5]+$'// 验证手机号const phoneReg = '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$'// 创建验证规则,验证规则是一个对象// 每一项是一个验证规则,验证规则属性需要和验证的数据进行同名const rules = {name: [{ required: true, message: '请输入收货人姓名' },{ pattern: nameRegExp, message: '收货人姓名不合法' }],phone: [{ required: true, message: '请输入收货人手机号' },{ pattern: phoneReg, message: '手机号不合法' }],provinceName: { required: true, message: '请选择收货人所在地区' },address: { required: true, message: '请输入详细地址' }}// 创建验证实例,并传入验证规则const validator = new Schema(rules)// 调用实例方法对数据进行验证// 注意:我们希望将验证结果通过 Promsie 的形式返回给函数的调用者return new Promise((resolve) => {validator.validate(params, (errors, fields) => {if (errors) {// 如果验证失败,需要给用户进行提示wx.toast({title: errors[0].message})resolve({ valid: false })} else {resolve({ valid: true })}})})},// coding...
})

通过上述步骤和代码,你可以轻松地实现一个功能完备的表单验证逻辑,确保用户输入的数据符合业务规则。


http://www.ppmy.cn/ops/121897.html

相关文章

李宏毅深度学习-梯度下降和Batch Normalization批量归一化

Gradient Descent梯度下降 ▽ -> 梯度gradient -> vector向量 -> 下图中的红色箭头(loss等高线的法线方向) Tip1: Tuning your learning rates Adaptive Learning Rates自适应lr 通常lr会越来越小 Adaptive Learning Rates中每个参数都给它不…

使用 Node.js 创建一个 WebSocket 服务器

使用 Node.js 创建一个 WebSocket 服务器相对简单。你可以使用 ws 库,这是一个流行的 WebSocket 实现。以下是一个基本的步骤来创建一个 WebSocket 服务器: 1.初始化 Node.js 项目: 首先,你需要一个 Node.js 项目。如果你还没有项…

Pikachu-Sql-Inject - 通过sql进行远程服务器控制(试验)

secure_file_priv是MySQL中的系统变量,用于限制文件的读取和写入。 查看命令: show variables like "secure%" //或者 select secure_file_priv; 1.secure_file_priv NULL ,限制文件的读取和写入。 2.secure_file_priv 文件路…

oracle 新建用户,用户插入数据报错:ORA-01950: 对表空间 ‘USERS‘ 无权限

oracle 新建用户,用户插入数据报错:ORA-01950: 对表空间 ‘USERS’ 无权限 根据业务需求创建了一个新的表空间和一个新的用户,当用这个新用户创建表时,报错:ORA-01950: 表空 间’USERS’中无权限。我已经把创建表的权限赋给了此用…

Java每日面试题(JVM)(day15)

目录 Java对象内存布局markWord 数据结构JDK1.8 JVM 内存结构JDK1.8堆内存结构GC垃圾回收如何发现垃圾如何回收垃圾 JVM调优参数 Java对象内存布局 markWord 数据结构 JDK1.8 JVM 内存结构 程序计数器: 线程私有,记录代码执行的位置. Java虚拟机栈: 线程私有&#…

程序猿成长之路之设计模式篇——设计模式简介

无论是对于代码质量还是代码可维护性、可扩展性,使用合适的设计模式都能够起到促进提升的作用,此外在软考的软件工程师、系统架构师职称考试中,设计模式也是必考的一块内容,因此我打算开拓一个新的专栏简单介绍一下设计模式&#…

深入浅出 CSS 定位:全面解析与实战指南

“批判他人总是想的太简单 剖析自己总是想的太困难” 文章目录 目录 前言文章有误敬请斧正 不胜感恩!1. CSS 定位概述2. 定位类型详解2.1 static(默认定位)2.2 relative(相对定位)2.3 absolute(绝对定位&am…

C++ 函数模板与类模板知识点总结

一、基础概念 1.1 什么是模板 模板是 C 的一个特性&#xff0c;使得你可以编写与类型无关的代码。模板通过定义类型参数&#xff0c;使得同一段代码可以适用于多种数据类型。 二、函数模板 2.1 定义与语法 基本定义&#xff1a; template <typename T> T functionNa…