首页 > web前端 > js教程 > 正文

使用 Formik 和 Yup 实现 React 表单多重错误信息展示

霞舞
发布: 2025-10-03 17:24:02
原创
228人浏览过

使用 formik 和 yup 实现 react 表单多重错误信息展示

本文介绍了如何结合 Formik 和 Yup 在 React 表单中实现更灵活的错误信息展示,特别是针对密码等字段,可以同时显示多个验证错误。通过自定义 Yup 的 test 方法,我们可以捕获所有不符合规则的错误信息,并将它们一次性返回给 Formik,从而实现多重错误信息的同步展示。

在使用 Formik 和 Yup 进行表单验证时,默认情况下,Yup 会在遇到第一个错误时停止验证,并返回该错误信息。但在某些场景下,例如密码字段,我们可能希望同时展示所有不符合规则的错误信息,以帮助用户更快速地了解密码的复杂性要求。

以下是如何使用 Yup 的 test 方法来实现这一目标:

import * as Yup from 'yup';
import { useFormik } from 'formik';

const validationSchema = Yup.object({
  email: Yup.string().required("Required field").email("Invalid email format"),
  password: Yup.string()
    .required("Required field password")
    .test({
      test: (value) => {
        let errors = [];

        if (!/^(?=.{8,})/.test(value)) {
          errors.push("Must Contain 8 Characters");
        }

        if (!/^(?=.*[!@#\$%\^&\*])/.test(value)) {
          errors.push("One Special Case Character");
        }

        if (!/^(?=.*[0-9])/.test(value)) {
          errors.push("One Number");
        }

        if (!/^(?=.*[a-z])/.test(value)) {
          errors.push("One Lowercase");
        }

        if (!/^(?=.*[A-Z])/.test(value)) {
          errors.push("One Uppercase");
        }

        if (errors.length > 0) {
          throw new Yup.ValidationError({
            errors: errors,
            inner: true,
            path: "password",
            message: errors,
            value: value,
            name: "ValidationError",
          });
        }

        return true;
      },
    }),
});

const MyForm = () => {
  const formik = useFormik({
    initialValues: {
      email: '',
      password: '',
    },
    validationSchema: validationSchema,
    onSubmit: (values) => {
      alert(JSON.stringify(values));
    },
  });

  const { errors, touched, getFieldProps } = formik;

  return (
    <form onSubmit={formik.handleSubmit}>
      <div>
        <label htmlFor="email">Email</label>
        <input
          id="email"
          type="email"
          {...getFieldProps('email')}
        />
        {touched.email && errors.email ? (
          <div>{errors.email}</div>
        ) : null}
      </div>

      <div>
        <label htmlFor="password">Password</label>
        <input
          id="password"
          type="password"
          {...getFieldProps('password')}
        />
        {touched.password && errors.password ? (
          <div>
            {Array.isArray(errors.password) ? (
              errors.password.map((error, index) => (
                <div key={index}>{error}</div>
              ))
            ) : (
              <div>{errors.password}</div>
            )}
          </div>
        ) : null}
      </div>

      <button type="submit">Submit</button>
    </form>
  );
};

export default MyForm;
登录后复制

代码解释:

表单大师AI
表单大师AI

一款基于自然语言处理技术的智能在线表单创建工具,可以帮助用户快速、高效地生成各类专业表单。

表单大师AI 74
查看详情 表单大师AI
  1. 引入必要的库: 导入 Yup 用于定义验证规则,useFormik 用于处理表单状态和提交。
  2. 定义验证 Schema: 使用 Yup.object() 创建验证 schema。
  3. 自定义 test 方法: 针对 password 字段,使用 test 方法自定义验证逻辑。
    • 在 test 方法中,定义一个 errors 数组,用于存储所有验证失败的错误信息。
    • 使用正则表达式测试密码是否满足各个规则(长度、特殊字符、数字、大小写字母)。
    • 如果某个规则不满足,则将相应的错误信息添加到 errors 数组中。
    • 如果 errors 数组不为空,则抛出一个 Yup.ValidationError 异常,并将 errors 数组作为 message 传递。 inner: true 确保Yup能够正确处理嵌套错误。
  4. 使用 useFormik: 初始化 useFormik hook,传入 initialValues、validationSchema 和 onSubmit。
  5. 展示错误信息: 在表单中,使用 formik.errors 和 formik.touched 来判断是否需要展示错误信息。
    • 因为 errors.password 可能是一个字符串(单个错误)或一个数组(多个错误),所以需要使用条件渲染来处理这两种情况。
    • 如果 errors.password 是一个数组,则使用 map 方法遍历数组,并逐个展示错误信息。

注意事项:

  • Yup.ValidationError 的 path 属性必须设置为要验证的字段名(例如 "password"),这样 Formik 才能正确地将错误信息与相应的字段关联起来。
  • inner: true 是关键,确保 Yup 能够处理由 test 方法抛出的嵌套错误。
  • 在展示错误信息时,需要判断 errors.password 的类型,以正确地渲染错误信息。

总结:

通过自定义 Yup 的 test 方法,我们可以实现更灵活的表单验证逻辑,并能够同时展示多个错误信息。这种方法特别适用于密码等需要满足多个规则的字段,可以有效地提升用户体验。

以上就是使用 Formik 和 Yup 实现 React 表单多重错误信息展示的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号