Yup.mixedtest似乎破坏了Formik表单验证

如何解决Yup.mixedtest似乎破坏了Formik表单验证

这可能看起来很长,但这仅是因为我想确保提供所有的信息。所以我在react组件中有一个Formik表单,该表单可以处理几个文本输入和一些文件上传。我正在React类组件中使用这个Formik组件:

<Formik 
  initialValues={{
   ...initialValues,//no need to list them all here
   affiliatelogo: null,}} 
  validationSchema={validationSchema}
  onSubmit(values=>{//do something with the values})
>
 {(
   values,errors,touched,setFieldValue,handleSubmit,handleChange,handleBlur
) => <form>...</form>}
</Formik>

这是文件上传输入字段:

<input
  type="file"
  id="affiliatelogo"
  name="affiliatelogo"
  onChange={event => setFieldValue('affiliatelogo',event.currentTarget.files[0])}
  onBlur={handleBlur}
/>

//validation error message added to every input field as below

{
  errors.affiliatelogo && touched.affiliatelogo
    ? <p className="errors">{errors.affiliatelogo}</p>
    : null
}

这是validationSchema的相关部分:

affiliatelogo: Yup.mixed()
  .test('fileType','Unsupported File Format',function (value) {
    const SUPPORTED_FORMATS = ['image/jpg','image/jpeg','image/png'];
    return SUPPORTED_FORMATS.includes(value.type)
  })
  .test('fileSize',"File Size is too large",value => {
    const sizeInBytes = 500000;//0.5MB
    return value.size <= sizeInBytes;
  })

由于某种原因,当将Yup.mixed()。test()添加到validationSchema时,表单验证会中断:直到我选择带有文件输入的文件后,验证错误才会显示,然后突然出现错误消息(问题不是验证本身,而是以错误消息的形式显示验证结果)。

因此,假设我尝试提交未修改的表单-我希望所有错误消息都会出现(因为表单验证应由Formik在提交时触发),但是当此文件输入与Yup.mixed挂钩时,什么也不会发生().test()验证器。然后,我继续选择一个文件,该文件显示所有错误消息(包括用于文件输入本身的正确错误消息)。

或另一个示例:我访问了一个必填文本字段,然后不输入任何内容就将其保留。如果我注释掉Yup.mixed()。test()验证器,则此方法很好(错误消息出现在模糊处)。当验证器在那里时,什么也没有发生-仅当我选择带有文件输入字段的文件时,验证错误消息才会出现。

我一直在查看Yup和Formik文档,但在堆栈溢出时都找不到任何有关此的信息。

有人可以指出我想念的东西吗?

谢谢。

解决方法

可能是您的验证器抛出了意外错误。 console.log(value)-您可能会发现它在某些时候不是对象,尝试访问size和type属性会引发错误,导致验证失败。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?