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

目录

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

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

示例

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

安装

首先,安装 FormikYup

npm install formik yup

示例代码

以下是一个完整的示例,展示了如何使用 FormikYup 进行表单处理和 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>
    

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

Schema Validation 产生背景和机制

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…