- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个输入字段(类型文件),出于某种原因即使不是必需的也可以验证。有了序列号,我有一个验证,它不是必需的,似乎工作正常,提交空字段时没有错误。对于文件输入字段,我只希望输入字段在上传文件时进行验证。我做错了什么?,当我点击提交测试验证时,我得到了这个(见下图)。
这是我的代码:
const validationSchema = Yup.object({
title: Yup.string()
.required("Title is required")
.min(8, "Title must be at least 8 characters")
.max(100, "Title cannot be more than 100 characters"),
description: Yup.string()
.required("Description is required")
.min(8, "Description must be at least 8 characters")
.max(100, "Description cannot be more than 100 characters"),
serialNumber: Yup.string()
.min(4, "Serial number must be at least 4 characters")
.max(16, "Serial number cannot be more than 16 characters"),
productStatus: Yup.number().required("A Status is required"),
productType: Yup.number().required("A type is required"),
img: Yup.mixed()
.test(
"fileSize",
"File size too large, max file size is 1 Mb",
(file) => file && file.size <= 1100000
)
.test(
"fileType",
"Incorrect file type",
(file) =>
file && ["image/png", "image/jpg", "image/jpeg"].includes(file.type)
),
});
{formik.errors["img"] && formik.touched["img"] && (
<div style={{ color: "#B2484D", fontSize: ".8rem" }}>
{formik.errors.img}
</div>
)}
<Field name="img">
{() => {
// < - this will take fieldProps.. not used in this case, using formik instead
return (
<>
<input
onBlur={formik.handleBlur}
onChange={({ currentTarget }) => {
const file = currentTarget.files![0];
const reader = new FileReader();
if (file) {
reader.onloadend = () => {
setSelectedFile({
file,
previewURI: reader.result!,
});
setuploadbtnLabel(
`You selected: ${file.name} - click again to change`
);
};
reader.readAsDataURL(file);
formik.setFieldValue("img", file);
}
}}
ref={inputFile}
type="file"
style={{ display: "none" }}
accept=".png,.jpg,.jpeg"
/>
</>
);
}}
</Field>
编辑:这是一个codesandbox https://codesandbox.io/s/thirsty-chandrasekhar-34q1q?file=/src/App.js
最佳答案
我认为您应该尝试将 notRequired()
甚至 nullable()
添加到 YUP 模式定义的 img
字段中。来自是的docs :
Mark the schema as not required. Passing undefined (or null for nullable schema) as value will not fail validation.
编辑:根据您提供的沙箱,我能够弄明白。问题来自您添加的测试。基本上,问题是当没有选择文件时 file
是 undefined,因此验证总是失败。
例如你可以改变这个:
.test(
"fileSize",
"File size too large, max file size is 1 Mb",
(file) => file && file.size <= 1100000
)
对此:
.test(
"fileSize",
"File size too large, max file size is 1 Mb",
(file) => {
if (file) {
return file.size <= 1100000;
} else {
return true;
}
}
)
notRequired()
或 nullable()
甚至都不是让它按照您期望的方式工作所必需的。这是 sandbox 的链接有了这个修复。如果这对您有用,请将答案标记为已接受。
祝你好运!
关于reactjs - Formik 和 yup 验证正在验证一个非必需的文件输入字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65297160/
我正在处理多种表单。在某些情况下,表格具有相似的字段,例如姓名、电话号码、帐号等。我也在使用 formik 。我为每个表单创建了架构文件 (schema.js)。在里面我列出了所有模式验证并返回该模式
我在“react”中创建了一个多步骤表单:“^17.0.1”、“yup”:“^0.29.3”和“formik”:“^2.2.3”。 我想检查用户输入的生日 (dobD) 根据出生月份 (dobM) 和
我如何基本上创建这个 https://design-system.service.gov.uk/patterns/dates/在带有 yup 验证的 formik 中。 因此 day、month 和
我有两个与 Yup 验证库相关的问题...这些问题是相互关联的。 第一个问题。 有什么方法可以启用验证并返回验证中的所有错误。看例子: const petSchema = yup.string()
我有一个架构: const SignupSchema = Yup.object().shape({ decimal: Yup.number().integer('invalid decimal')
如何实现 1 个字段的值应始终大于另一个字段的值。 这是我的模式 value: Yup.number().required(''), value2: Yup.number().when('
在我的 JavaFX 应用程序中,我使用 SceneBuilder by Gluon 。场景的预览具有 Y Down 坐标系(Y 向下增加)。但是,当我将fxml文件导入Java时,坐标全部翻转。以下
我有一个包含相互依赖的数字字段的模型,我正在努力了解如何使用 yup 设置复杂的验证. 为了简单起见,想象一个具有以下形状的对象: { a: number, b: number } 我
我有一个运行大量验证的架构。但是我不想在出现错误时显示一些错误消息,尽管我希望突出显示该字段。提供空字符串而不是错误消息会导致 formik 在验证运行时不显示红色输入字段。这是我当前的代码 cons
我正在使用 formik 来实现我们的表单。当您在上面的行中添加数据时,我们需要追加一行新的字段。提交表单时,我们收到 yup 验证错误,因为新添加的行不符合条件。请提出任何解决方案以跳过对新添加的行
我一直在使用 Yup 和 Formik 在 React 中进行表单验证。如何设置输入语言的验证?我希望用户可以(并且只能)以特定语言书写(更改键盘的默认语言) const validationSche
我想通过将模式放在单独的文件中来组织我的表单代码。我注意到,当我导出一个 yup 模式,然后将其导入另一个模式时,它总是失败。模式数据似乎是正确的(当我控制日志时),但是,导入模式的验证从未运行。 例
我得到了以下代码: name: yup .string() .trim() .required(message("nameMissing"))
我有一个验证,它只通过检查它们是否违反了它的唯一规则来验证它的字段,但它允许数组内的重复。 我想要某种不允许其中有重复值的条件。 我的目标: respostas: Yup.array() .o
我正在尝试使用 yup 进行密码验证,其中至少满足 4 个密码条件中的 3 个。我很难找到现有的方法来做到这一点。 我的要求是这样的: At least 8 characters It must us
我使用 react-hook-form 和 yup 来验证我的表单。 我想知道架构的所有必填字段以在表单中显示一些信息(如必填字段的“*”)。我们可以通过这行代码实现这一点: schema.descr
我正在使用 react-hook-form与 Yup用于在我的应用程序中管理表单的库。 我正在尝试根据我的组件状态创建动态 Yup 模式。 例如: import React, { useContext
我正在使用 Yup 的 .test() 在 Formik 中尝试异步验证方法并需要设置我从 API 获得的错误消息。根据后端的某些条件,错误消息会有所不同。 尝试了这里提到的几个解决方案 https:
我正在尝试在 angular7 项目中添加 yup。我已成功将其添加到我的组件中。 readonly optionalRequiredSchema = yup.object().shape({
我已经定义了一个 yup 模式 export const ValidationSchema = yup.object().shape({ dateTo: yup .date()
我是一名优秀的程序员,十分优秀!