HOW - 结合 Form 和 Schema 的数据验证方案(Shema Validation)

目录

  • 示例
    • 安装
    • 示例代码
    • 解释
  • Schema Validation 产生背景和机制
    • 产生背景
    • 机制
      • Zod
      • Yup
    • 机制和工作原理
    • 结论

在 React 应用中,使用表单和 Schema Validation 可以有效地管理表单状态和验证输入数据。

示例

常见的库包括 Formik 和 Yup。Formik 用于管理表单状态,而 Yup 是一个用于数据验证的 Schema Validation 库。以下是一个结合 Formik 和 Yup 的示例,用于处理表单和 Schema Validation。

安装

首先,安装 Formik 和 Yup:

npm install formik yup

示例代码

以下是一个完整的示例,展示了如何使用 Formik 和 Yup 进行表单处理和 Schema Validation。

import React from 'react';
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';// 定义表单验证的 Schema
const validationSchema = Yup.object().shape({name: Yup.string().min(2, '名字太短了!').max(50, '名字太长了!').required('名字是必填项'),email: Yup.string().email('无效的电子邮件地址').required('电子邮件是必填项'),password: Yup.string().min(8, '密码必须至少8个字符').required('密码是必填项'),
});const MyForm = () => (<div><h1>注册表单</h1><FormikinitialValues={{ name: '', email: '', password: '' }}validationSchema={validationSchema}onSubmit={(values, { setSubmitting }) => {setTimeout(() => {alert(JSON.stringify(values, null, 2));setSubmitting(false);}, 400);}}>{({ isSubmitting }) => (<Form><div><label htmlFor="name">名字</label><Field type="text" name="name" /><ErrorMessage name="name" component="div" /></div><div><label htmlFor="email">电子邮件</label><Field type="email" name="email" /><ErrorMessage name="email" component="div" /></div><div><label htmlFor="password">密码</label><Field type="password" name="password" /><ErrorMessage name="password" component="div" /></div><button type="submit" disabled={isSubmitting}>提交</button></Form>)}</Formik></div>
);export default MyForm;

解释

  1. Validation Schema:我们使用 Yup 来定义一个验证模式,包括每个字段的验证规则。

    const validationSchema = Yup.object().shape({name: Yup.string().min(2, '名字太短了!').max(50, '名字太长了!').required('名字是必填项'),email: Yup.string().email('无效的电子邮件地址').required('电子邮件是必填项'),password: Yup.string().min(8, '密码必须至少8个字符').required('密码是必填项'),
    });
    
  2. Formik Setup:使用 Formik 组件来包装我们的表单,提供初始值、验证模式和提交处理函数。

    <FormikinitialValues={{ name: '', email: '', password: '' }}validationSchema={validationSchema}onSubmit={(values, { setSubmitting }) => {setTimeout(() => {alert(JSON.stringify(values, null, 2));setSubmitting(false);}, 400);}}
    >
    
  3. Form Components:使用 Formik 提供的 Field 组件来绑定表单字段,并使用 ErrorMessage 组件来显示验证错误消息。

    <Form><div><label htmlFor="name">名字</label><Field type="text" name="name" /><ErrorMessage name="name" component="div" /></div><div><label htmlFor="email">电子邮件</label><Field type="email" name="email" /><ErrorMessage name="email" component="div" /></div><div><label htmlFor="password">密码</label><Field type="password" name="password" /><ErrorMessage name="password" component="div" /></div><button type="submit" disabled={isSubmitting}>提交</button>
    </Form>
    

这个示例展示了如何将 Formik 和 Yup 结合使用,以便在 React 应用中实现表单处理和验证。通过这种方式,可以轻松地管理表单状态并确保输入数据的有效性。

Schema Validation 产生背景和机制

Schema Validation 库(如 zod 和 yup)的产生背景主要源于前端开发中对数据验证的需求。

随着 JavaScript 和 TypeScript 在前端开发中的普及,验证数据结构和内容的正确性变得尤为重要。以下是这些库的产生背景、机制以及如何运作的简要说明。

产生背景

  1. 数据完整性和安全性:在前端开发中,确保数据的完整性和安全性至关重要。无论是从用户输入中获取数据,还是从 API 请求中接收数据,都需要对数据进行验证,以确保其格式和内容符合预期。
  2. 代码简洁和可维护性:传统的数据验证方式通常涉及大量的条件判断代码,这不仅繁琐,而且难以维护。Schema Validation 库提供了一种声明式的方法,使验证逻辑更加简洁和易于维护。
  3. TypeScript 的流行:随着 TypeScript 的普及,对静态类型和类型安全的需求增加。Schema Validation 库能够很好地与 TypeScript 集成,提供类型推断和类型验证功能。

机制

Schema Validation 库通常采用声明式的方法来定义数据的结构和验证规则。这些库会根据定义的 Schema 自动生成验证逻辑,并在运行时对数据进行验证。

Zod

zod 是一个 TypeScript 优先的 Schema 声明和验证库。它的设计目标是提供一个简单、直观的 API,同时利用 TypeScript 的类型系统进行类型推断和类型安全。

import { z } from 'zod';const schema = z.object({name: z.string().min(2, '名字太短了!').max(50, '名字太长了!'),email: z.string().email('无效的电子邮件地址'),password: z.string().min(8, '密码必须至少8个字符'),
});// 验证数据
const result = schema.safeParse({name: 'John',email: 'john.doe@example.com',password: 'password123',
});if (!result.success) {console.log(result.error.errors);
} else {console.log('数据有效:', result.data);
}

Yup

yup 是一个 JavaScript 的 Schema 构建器,用于运行时值解析和验证。它支持嵌套对象和数组的验证,提供丰富的验证规则和自定义验证功能。

import * as Yup from 'yup';const schema = Yup.object().shape({name: Yup.string().min(2, '名字太短了!').max(50, '名字太长了!').required('名字是必填项'),email: Yup.string().email('无效的电子邮件地址').required('电子邮件是必填项'),password: Yup.string().min(8, '密码必须至少8个字符').required('密码是必填项'),
});// 验证数据
schema.validate({name: 'John',email: 'john.doe@example.com',password: 'password123',
})
.then((data) => {console.log('数据有效:', data);
})
.catch((err) => {console.log(err.errors);
});

机制和工作原理

  1. Schema 定义:通过声明式语法定义数据结构和验证规则。Schema 可以是简单的字段规则,也可以是嵌套的对象和数组。
  2. 验证数据:库会根据定义的 Schema 自动生成验证逻辑。在运行时,库会遍历数据结构,并根据 Schema 定义的规则逐个验证每个字段。
  3. 错误处理:如果数据不符合 Schema 定义的规则,库会返回详细的错误信息,指明哪个字段出现了问题以及具体的错误原因。

结论

Schema Validation 库(如 zod 和 yup)通过声明式的 API 提供了一种高效、简洁的数据验证方式,极大地简化了前端开发中的数据验证逻辑,并提高了代码的可维护性和安全性。它们的产生背景和机制体现了前端开发对数据完整性、类型安全和代码简洁性的追求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/bicheng/45913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot+vue系统开发

链接: https://pan.baidu.com/s/1P1YpHAx9QOBPxjFZ9SAbig 提取码: u6f1

如何设计一个C语言面向结构体的内存数据库

内存数据库 一般所谓内存数据库&#xff0c;是指能够与应用运行在同一个进程内的数据库&#xff0c;也就是说能够被嵌入到进程内运行的数据库。 比较著名的内存数据库软件&#xff0c;例如&#xff0c;Sqlite&#xff1b;以及新生代的NOSql key-value数据库bdb(Berkeley DB)、…

Java基础(十九):集合框架

目录 一、Java集合框架体系二、Collection接口及方法1、添加2、判断3、删除4、其它 三、Iterator(迭代器)接口1、Iterator接口2、迭代器的执行原理3、foreach循环 四、Collection子接口1&#xff1a;List1、List接口特点2、List接口方法3、List接口主要实现类&#xff1a;Array…

GuLi商城-商品服务-API-品牌管理-统一异常处理

每个方法都加这段校验太麻烦了 准备做一个统一异常处理@ControllerAdvice 后台代码: package com.nanjing.gulimall.product.exception;import com.nanjing.common.exception.BizCodeEnum; import com.nanjing.common.utils.R; import lombok.extern.slf4j.Slf4j; import org…

【Linux】任务管理

这个任务管理&#xff08;job control&#xff09;是用在bash环境下的&#xff0c;也就是说&#xff1a;【当我们登录系统获取bashshell之后&#xff0c;在单一终端下同时执行多个任务的操作管理】。 举例来说&#xff0c;我们在登录bash后&#xff0c;可以一边复制文件、一边查…

adb 常用的命令总结

1、adb logcat 抓取日志 adb logcat > d:\log.txt Ctrlc 结束日志抓取 adb logcat -c > d:\log.txt 清空旧日志 发生Native Crash 时&#xff0c;抓取错误报告 adb logcat -b crash 抓取筛选后的日志&#xff1a; adb logcat -s AndroidRuntime > d:\log…

解析Java中1000个常用类:EnumSet类,你学会了吗?

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

CSS 单位中 px、em 和 rem 的区别?

在CSS中&#xff0c;px、em和rem是常用的长度单位&#xff0c;它们之间有一些区别&#xff1a; px&#xff08;像素&#xff09;&#xff1a; px是相对长度单位&#xff0c;它是相对于显示器屏幕分辨率的一个点的大小。 px单位是固定的&#xff0c;不会随着父元…

代码随想录算法训练营第五十二天(图论)| 98. 所有可达路径、深度优先搜索、广度优先搜索

邻接矩阵 邻接矩阵是一种使用二维数组来表示图的方法。矩阵中的元素表示节点之间是否存在边。如果存在边&#xff0c;则对应的矩阵元素为1&#xff08;或边的权重&#xff09;&#xff1b;否则为0。 特点&#xff1a; 空间复杂度高&#xff1a;无论图是否稀疏&#xff0c;邻…

前端Canvas入门——一些注意事项

创建渐变的三种方法&#xff1a; createLinearGradient() - 线性渐变 createRadialGradient() - 径向渐变&#xff08;放射性渐变&#xff09; createConicGradient() - 锥形渐变 这三种的核心观点都是&#xff1a; 创建一个gradient对象&#xff0c;然后调用addColorStop()方法…

【java】力扣 合并两个有序链表

文章目录 题目描述题目链接思路代码 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 题目链接 21. 合并两个有序链表 思路 先定义一个哨兵节点dummy&#xff0c;为了方便解题 然后定义一个节点pre&#xff0…

paddlepaddle2.6,paddleorc2.8,cuda12,cudnn,nccl,python10环境

1.安装英伟达显卡驱动 首先需要到NAVIDIA官网去查自己的电脑是不是支持GPU运算。 网址是&#xff1a;CUDA GPUs | NVIDIA Developer。打开后的界面大致如下&#xff0c;只要里边有对应的型号就可以用GPU运算&#xff0c;并且每一款设备都列出来相关的计算能力&#xff08;Compu…

模板方法模式的实现

1. 引言: 交易管理系统中的模板方法模式 之前做过一个交易管理系统&#xff0c;其中有一个核心模块是“交易流程管理”&#xff0c;该模块需要处理不同类型的交易&#xff0c;比如期货交易、期权交易和股票交易。在构建交易管理系统的过程中&#xff0c;我们面临了一个核心挑战…

为二进制文件添加.gnu_debugdata调试信息

前言 在使用gcc/g编译二进制文件过程中&#xff0c;如果添加了-g参数&#xff0c;编译出来的二进制文件会带有debug信息&#xff0c;供调试使用。但是debug信息往往占用空间很大&#xff0c;导致二进制文件太大&#xff0c;在发布到生产环境时&#xff0c;一般会去掉调试信息&…

(南京观海微电子)——电容应用及选取

什么是电容器&#xff1f; 电容器是一种在内部电场中储存能量的电子器件。它与电阻器、电感器一样&#xff0c;都是基本的无源电子元件。所有电容器都具有相同的基本结构&#xff0c;两块导电极板中间由绝缘体隔开&#xff0c;该绝缘体称为电介质&#xff0c;可在施加电场后发…

时间轮算法理解、Kafka实现

概述 TimingWheel&#xff0c;时间轮&#xff0c;简单理解就是一种用来存储若干个定时任务的环状队列&#xff08;或数组&#xff09;&#xff0c;工作原理和钟表的表盘类似。 关于环形队列&#xff0c;请参考环形队列。 时间轮由两个部分组成&#xff0c;一个环状数组&…

一文了解MySQL的表级锁

文章目录 ☃️概述☃️表级锁❄️❄️介绍❄️❄️表锁❄️❄️元数据锁❄️❄️意向锁⛷️⛷️⛷️ 介绍 ☃️概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0…

Coze:如何使用团队空间?

你好&#xff0c;我是三桥君 团队空间&#xff0c;是一个允许我们组建团队并共享机器人、插件等资源的功能。 好的&#xff0c;让我们开始创建一个团队。我们将这个团队命名为“三桥君AI”&#xff0c;并在描述中也填写“这里是关于“三桥君AI”团队的描述”。点击确定后&…

VMware_centos8安装

目录 VMware Workstation Pro的安装 安装centos VMware Workstation Pro的安装 正版VMware 17百度网盘下载链接 (含秘钥) 链接&#xff1a;https://pan.baidu.com/s/16zB-7IAACM_1hwR1nsk12g?pwd1111 提取码&#xff1a;1111 第一次运行会要求输入秘钥 秘钥在上边的百度网盘…

【CUDA|CUDNN】安装

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 显卡驱动安装参考之前的文章 cuda、cudnn 安装 1. cuda 安装 访问https://developer.nvidia.com/cuda-toolkit-archive 选择需要的版本&#xff1a;h…