我正在try 在react.js上使用formik和yup进行验证.在我为YUP创建的模式中,有一个邮箱和密码部分,我只想要show all the errors in the password section at the same time, the errors in the email section should be displayed in order,但我做不到,但如果你能帮助我,我将非常感激.

下面是我如何创建YUP对象的

 const validationPageTwo = Yup.object({
   email: Yup.string().required("Required field"),
   password: Yup.string()
  .required("Required field password")
  .matches(/^(?=.{8,})/, "Must Contain 8 Characters")
  .matches(/^(?=.*[!@#\$%\^&\*])/, " One Special Case Character")
  .matches(/^(?=.*[0-9])/, " One Number")
  .matches(/^(?=.*[a-z])/, " One Lowercase")
  .matches(/^(?=.*[A-Z])/, " One Uppercase"),
 });



const formik = useFormik({
 initialValues: {
  name: "",
  surname: "",
  email: "",
  password: "",
 },
 validationSchema: page === 1 ? validationPageOne : 
 validationPageTwo,
 onSubmit: (values) => {
  if (page === 1) {
    setPage(2);
  } else {
    alert(JSON.stringify(values));
  }
 },
});

推荐答案

要一次显示所有密码错误,您可以使用validate方法,而不是链接多个matches调用.这允许您编写一个定制函数,您可以在其中添加您的定制验证,并在您认为合适的时候添加错误.

下面是一个如何实现这一目标的例子:

const validationPageTwo = Yup.object({
  email: Yup.string().required("Required field"),
  password: Yup.string()
    .required("Required field password")
    .validate(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) {
        return new Yup.ValidationError(errors, value, 'password');
      }

      return value;
    }),
});

在上述模式中,如果密码值不符合要求,则密码字段将以数组形式一次性返回其所有错误.

然后,您可以在表单中通过映射列出所有密码错误,如下所示:

{
  errors.password && errors.password.inner.map((err, index) => <p key={index}>{err.message}</p>)
}

请记住将errors.password替换为窗体状态下Password Errors对象的实际路径.

请记住,validate函数必须要么返回验证值(如果验证成功),要么抛出Yup.ValidationError(如果验证失败),要么返回promise .

此外,对于邮箱验证,您可能需要添加一条规则以确保它确实是邮箱:

email: Yup.string()
    .required("Required field")
    .email("Must be a valid email address"),

还请注意,使用Formik+Yup,来自Yup的错误可以在Formik向您的表单提供的错误props 中找到.

Javascript相关问答推荐

如何制作删除按钮以从列表中删除该项目所属的项目?

IMDB使用 puppeteer 加载更多按钮(nodejs)

为什么ngModel不能在最后一个版本的Angular 17上工作?'

自定义高图中的x轴标签序列

setcallback是什么时候放到macrotask队列上的?

使用GraphQL查询Uniswap的ETH价格

WhatsApp Cloud API上载问题:由于MIME类型不正确而导致接收&Quot;INVALID_REQUEST";错误

环境值在.js文件/Next.js中不起作用

Use Location位置成员在HashRouter内为空

Webpack在导入前混淆文件名

如何在箭头函数中引入or子句?

为什么这个.add.group({})在教程中运行得很好,但在我的游戏中就不行了?

处理TypeScrip Vue组件未初始化的react 对象

在SuperBase JS客户端中寻址JSON数据

在JavaScript中将Base64转换为JSON

select 2-删除js插入的项目将其保留为选项

有没有办法在R中创建一张具有多个色标的热图?

我如何才能获得价值观察家&对象&S的价值?

有角粘桌盒阴影

如何检测当前是否没有按下键盘上的键?