
本文档旨在指导开发者如何结合 Formik 和 Yup 在 React 应用中实现表单验证,并针对特定字段(如密码)展示所有验证错误信息,而其他字段(如邮箱)则按顺序显示错误。通过自定义 Yup 验证规则,可以灵活控制错误信息的展示方式,提升用户体验。
Formik 是一个流行的 React 表单库,简化了表单的处理、验证和提交。Yup 是一个 JavaScript 模式验证器,常与 Formik 结合使用,用于定义表单字段的验证规则。
核心在于自定义 Yup 的 test 方法,针对需要显示所有错误的字段(例如密码),手动编写验证逻辑,并将所有错误信息收集到一个数组中。如果验证失败,则抛出一个包含所有错误信息的 Yup.ValidationError。
以下是一个使用 Formik 和 Yup 实现密码字段多重错误提示的示例:
import React from 'react';
import { useFormik } from 'formik';
import * as Yup from 'yup';
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, null, 2));
    },
  });
  return (
    <form onSubmit={formik.handleSubmit}>
      <div>
        <label htmlFor="email">Email</label>
        <input
          id="email"
          name="email"
          type="email"
          onChange={formik.handleChange}
          onBlur={formik.handleBlur}
          value={formik.values.email}
        />
        {formik.touched.email && formik.errors.email ? (
          <div>{formik.errors.email}</div>
        ) : null}
      </div>
      <div>
        <label htmlFor="password">Password</label>
        <input
          id="password"
          name="password"
          type="password"
          onChange={formik.handleChange}
          onBlur={formik.handleBlur}
          value={formik.values.password}
        />
        {formik.touched.password && formik.errors.password ? (
          <div>
            {Array.isArray(formik.errors.password) ? (
              formik.errors.password.map((error, index) => (
                <div key={index}>{error}</div>
              ))
            ) : (
              <div>{formik.errors.password}</div>
            )}
          </div>
        ) : null}
      </div>
      <button type="submit">Submit</button>
    </form>
  );
};
export default MyForm;代码解释:
通过结合 Formik 和 Yup,并自定义 Yup 的 test 方法,可以灵活地实现表单字段的多重错误提示。这种方法可以提升用户体验,帮助用户更清晰地了解表单验证的错误信息。 关键在于利用 Yup.ValidationError 传递多个错误信息,并在 React 组件中正确渲染这些错误信息。
以上就是使用 Formik 和 Yup 实现 React 表单多重错误提示的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号