首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

多个字段上的formik验证

Formik 是一个流行的 React 库,用于处理表单的状态管理和验证。它允许开发者通过声明式的方式定义表单字段及其验证规则,从而简化了表单处理的复杂性。当涉及到多个字段的验证时,Formik 提供了几种机制来实现这一点。

基础概念

Formik 验证

  • Yup: Formik 通常与 Yup 结合使用,Yup 是一个强大的对象模式验证库,用于定义验证模式。
  • validate prop: 可以传递一个函数给 Formik 组件,该函数接收整个表单的值并返回错误对象。
  • validateOnChange 和 validateOnBlur: 控制何时触发验证。

相关优势

  1. 简化状态管理: Formik 自动处理表单状态,减少了样板代码。
  2. 集成验证: 与 Yup 结合,可以轻松创建复杂的验证逻辑。
  3. 错误处理: 自动显示每个字段的错误信息。
  4. 性能优化: 可以控制验证的时机,比如只在失去焦点或提交时验证。

类型

  • 同步验证: 验证逻辑立即执行。
  • 异步验证: 可以用于检查用户名是否唯一等需要网络请求的场景。

应用场景

  • 注册和登录表单: 需要验证用户输入的邮箱、密码等信息。
  • 搜索和过滤表单: 用户输入时即时验证输入的有效性。
  • 复杂的数据录入表单: 如财务报告或医疗记录,需要多字段间的依赖验证。

示例代码

以下是一个使用 Formik 和 Yup 进行多个字段验证的简单示例:

代码语言:txt
复制
import React from 'react';
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';

const validationSchema = Yup.object({
  firstName: Yup.string()
    .max(15, 'Must be 15 characters or less')
    .required('Required'),
  lastName: Yup.string()
    .max(25, 'Must be 25 characters or less')
    .required('Required'),
  email: Yup.string()
    .email('Invalid email address')
    .required('Required'),
});

const MyForm = () => (
  <Formik
    initialValues={{ firstName: '', lastName: '', email: '' }}
    validationSchema={validationSchema}
    onSubmit={(values, { setSubmitting }) => {
      setTimeout(() => {
        alert(JSON.stringify(values, null, 2));
        setSubmitting(false);
      }, 400);
    }}
  >
    {({ isSubmitting }) => (
      <Form>
        <Field type="text" name="firstName" />
        <ErrorMessage name="firstName" component="div" />

        <Field type="text" name="lastName" />
        <ErrorMessage name="lastName" component="div" />

        <Field type="email" name="email" />
        <ErrorMessage name="email" component="div" />

        <button type="submit" disabled={isSubmitting}>
          Submit
        </button>
      </Form>
    )}
  </Formik>
);

export default MyForm;

遇到问题及解决方法

问题: 表单提交时,即使字段无效,表单也会提交。

原因: 可能是因为 validateOnChangevalidateOnBlur 设置为 false,导致在提交前没有进行验证。

解决方法: 确保 validateOnChangevalidateOnBlur 至少有一个设置为 true,或者在 onSubmit 函数中手动调用 validateForm() 方法。

代码语言:txt
复制
<Formik
  // ...
  validateOnChange={true}
  validateOnBlur={true}
  // ...
>
  // ...
</Formik>

或者

代码语言:txt
复制
onSubmit={(values, { setSubmitting, validateForm }) => {
  validateForm().then(errors => {
    if (Object.keys(errors).length === 0) {
      // 表单验证通过,执行提交逻辑
    }
  });
}}

通过这种方式,可以确保在表单提交前,所有的字段都经过了正确的验证。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Formik:让用户体验更加出色的表单解决方案

目前在 github 上已经有近 34k 的 star,已广泛被各大公司使用,如: Airbnb:Formik 被用于 Airbnb 的一些项目中,包括其网站和移动应用程序。...它提供了一系列功能和特性,使创建、管理和验证表单变得更加容易, 如: 易于使用的 API:Formik 提供了一个简洁直观的 API,让你能够快速定义和操作表单字段。...高效的验证:Formik 内置了强大的验证功能,可以轻松地定义字段验证规则,并在用户输入时实时反馈错误信息。...Field 组件:用于渲染表单字段的组件,它接受表单字段的名称、类型和验证规则等参数,并根据这些参数渲染相应的表单字段。...ErrorMessage 组件:用于渲染表单验证错误信息的组件,它接受表单字段的名称和验证错误信息等参数,并根据这些参数渲染相应的错误信息。

35110

React 组件优化

使用时需要先下载: npm install formik --save Formik 库可以与 yup 库一块使用,库的作者也推荐搭配使用,yup 是一个用于验证字段的库,它的用法类似于 React 中的...需要验证的字段: nickname 昵称,最少 1 位,首尾不能有空格符,最多 30 位; email 邮箱,需要符合邮箱格式; password 密码,最小 6 位,最大 30 位; password....required("昵称还没填写呢~"), // required 表示必填项 email: Yup.string().email("无效的邮箱") // test 函数内部还可以异步的验证字段...使用 Formik + yup 库实现了验证逻辑与组件的解耦,验证逻辑统一由 yup 管理。 相对于 redux-form 库,我觉得 formik 库更好用一些吧。...在 Formik 官网,作者也举例了使用 redux-form 的缺陷: 表单状态本质上是短暂的和局部的,并不需要 redux 对其进行跟踪; 使用 redux 管理状态时,状态更新要派发 action

7.2K20
  • SQL语句distinct的多个字段去重问题

    将需要去重的字段添加到where条件中,取出唯一id 然后就可以获得去重之后的两个字段了 不过我这边是你需要去重一个字段,展示两个字段的情况 # 注意 有很多朋友问...,group by是可以对多字段进行去重的,但是我这里为什么还说不行呢?...我在这里统一描述下 由于时间比较早了,我大概记得当时的场景是:对一个字段进行去重,而需要取两个字段,这样的写法如下 select A,B from table group by A 但是group...by是不支持这种写法的,因为group by 和 select 中的字段必须保持一致 当前注意事项写于:2022年6月27日18:24:10 还可以看如下文章 Group_concat介绍与例子..._HashMap黑龙江分Map的博客-CSDN博客_group_concat mysql去重的最方便的两种方法_承影v的博客-CSDN博客_mysql去重 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人

    2.9K30

    update 修改单表的多个字段,造成数据混乱

    1.1、模拟问题现象1.2、问题故障原因1.3、解决故障2、问题总结2.1、快照读(select)2.2、当前读3、延伸思考 1、问题描述 今天 QQ群里在讨论一个问题,在某个环境里面,需要修改单个表的多个字段...| b | +------+------+ | 1 | 10 | | 2 | 20 | | 3 | 30 | +------+------+ # 进行修改多个字段.../image/update 修改多字段,造成数据混乱/1.png) 修改的条件是a=2,为啥修改的结果是(3,13),不应该是(3,12)吗?...into @a from t1 where a=2; # 修改数据 root@localhost [keme]>update t1 set a=@a+1,b=@a+10 where a=@a; #验证结果.../image/update 修改多字段,造成数据混乱/2.png) 2、问题总结 我们需要知道一些相关原理: 快照读,当前读 2.1、快照读(select) 执行select的时候,innodb默认会执行快照读

    99430

    一个表里面有多个字段,根据其中的一个字段进行去重,并且返回所有的字段

    1 需求 一个表里面有多个字段,根据其中的一个字段进行去重,并且返回所有的字段 2 实现 使用窗口函数: SELECT * FROM ( SELECT *, ROW_NUMBER...unique_column) AS row_num FROM table_name ) AS subquery WHERE row_num = 1; 在上述示例中,table_name 是要查询的表名...,column_name 是要去重的字段名,unique_column 是用于确定唯一行的辅助列(例如,主键或时间戳列)。...例如,如果你有一个名为 users 的表,其中包含 email 字段和 id 字段,你可以使用以下语句根据 email 字段进行去重查询并返回所有字段的值: SELECT * FROM ( SELECT...PARTITION BY email ORDER BY id) AS row_num FROM users ) AS subquery WHERE row_num = 1; 这将返回根据 email 字段去重后的所有字段的值

    30310

    cacti监控一个web上的多个tomcat

    cacti监控一个web上的多个tomcat 第二部分 2,看到手动在web界面添加cacti的tomcat模板文件,太耗时太麻烦,所以另选途径再构造一份cacti下的tomcat模板文件。...9500端口监控所获取的所有数据都是从9500端口的tomcat服务器上而来,如下图所示: 在Console –> Templates –> Data Templates/Graph Templates...一个基本端口8080一个9500端口的图像都出来了,如下所示: 最后在进入后台cacti数据库去查看下我们的验证: mysql> SELECT * FROM `data_template...假如你现在一个web服务器上又添加了一个9300的tomcat服务,你只需要把我分享的9500端口的xml中的hash末尾9500替换成9300,那么就又是一个新的xml模板。...以此类推,现在喜欢在一个linux服务器上搭建mysql多实例,那么多实例mysql如何在cacti下监控,也可以用本文中类似的办法构建新的mysql的多端口模板xml文件来重新加载实现。

    1.2K20

    VMware 修补了多个产品中的关键身份验证绕过漏洞

    Bleeping Computer 资讯网站披露,VMware 多个产品中出现关键身份验证绕过漏洞,漏洞允许攻击者获取管理员权限。...据悉,该漏洞被追踪为 CVE-2022-22972,最早由 Innotec Security 的 Bruno López 发现并报告,恶意攻击者可以利用该漏洞在不需要身份验证的情况下,获得管理员权限。...敦促管理员立即打补丁 漏洞披露不久后,VMware 发布公告表示,鉴于该漏洞的严重性,强烈建议用户应立刻采取行动,根据 VMSA-2021-0014 中的指示,迅速修补这一关键漏洞。...VMware 还修补了另外一个严重本地权限升级安全漏洞(CVE-2022-22973),攻击者可以利用该漏洞在未打补丁的设备上,将权限提升到 "root"。...(vRA) VMware云计算基础 vRealize Suite Lifecycle Manager 通常情况下,VMware 会在大多数安全公告中加入关于主动利用的说明,但在新发布的 VMSA-2022

    52920

    Django 外键引用另一个表中的多个字段

    在 Django 中,外键(ForeignKey)通常只引用另一张表的一个字段,比如一个主键或一个唯一标识字段。然而,如果我们需要让一个外键引用另一张表中的多个字段,通常有以下几种方法来实现这种关系。...1、问题背景在 Django 中,模型之间的关系通常使用外键(ForeignKey)来建立。外键允许一个模型中的字段引用另一个模型中的主键。然而,有时我们需要在一个模型中引用另一个模型中的多个字段。...2、解决方案为了在 sales_process 表中引用 product_models 表中的多个字段,我们可以使用复合主键(Composite Key)的方式。复合主键是指由多个字段组成的主键。...以下是如何在 Django 中使用复合主键来实现外键引用另一个表中的多个字段:在 product_models 模型中,添加一个 id 字段作为主键:class product_models(models.Model...sales_process.pricecommission = sales_process.commission这样,我们就能够在 sales_process 表中引用 product_models 表中的多个字段了

    10110

    这500多个字段引起的问题,大部分DBA都搞不定

    事实上,可以达到上面说的innodb 的最大限制1017个字段,超过1017个字段会有以下的报错: mysql> source create.sqlERROR 1117 (HY000): Too many...columns 但是这样做了以后,虽然理论上可以建立1017个text 类型的列,但是业务上进行insert或者update的时候,mysql是无法保证能执行成功的。...所以项目上建议还是保持默认值,将innodb_strict_mode设置为on。...解决方法如下: 1、针对项目中这种超多字段,同时又只能用MySQL的场景下,我们可以使用 MySQL5.7中最新推出的JSON类型的字段,这样即使很多列数据只算在一个JSON字段。...2、或者进行分表创建,限制单表的字段个数,从业务层面规避创建单表字段过多的问题,通过编写规范的SQL语句以及采用合适的集群的架构,才能发挥出MySQL自身的潜力。 至此,答案已经非常清晰了。

    1.8K30

    在线网站搭建(七):数据库字段的定义(上)

    这是只有2个app的情况,当还有更多的情况:3个,4个,5个...apps时,循环调用import会出错导致系统不能正确识别,而且最起码会造成时间上的等待。那么有没有好的方法来解决这个问题呢?...EmailVerifyRecord - 邮箱验证码 Banner - 轮播图 邮箱验证码的设计 验证码分三种类型,分别用于不同的功能:注册;找回密码;修改邮箱,所以在设计验证码类型的时候注意选择的条件,...通常验证码包括这些字段:code,email,send_type,send_time。...Create your models here.from django.contrib.auth.models import AbstractUser# 自己定义代码放置处 2 、不要在一行import多个库...如果你想获得更多关于PEP8的信息,可以查阅这篇信息PEP8 Python 编码规范整理或者官方文档PEP8的官方文档 至此,我们第七篇:在线教育网站的数据库字段的定义(上)就到此结束了,感谢你的赏阅。

    90020
    领券