如何在 FieldArray 中包含不同值的数组的 yup 验证中添加错误消息?
How to add error message to yup validation for array containing distinct values in FieldArray?
我正在尝试为我的字段数组添加错误消息,它应该包含不同元素的数组。以下是我的验证:
export const emails = yup
.array(
yup
.string()
.matches(/^\S+@\S+$/, {
message: "Must be a valid email id"
})
)
.test("Unique", "Email ids need to be unique", values => {
return new Set(values).size === values.length;
});
这是我的 FieldArray 组件的 render prop 中的 ErrorMessage 组件:
render={({ form, push, remove }) => (
<div>
{range(0, form.values[name].length).map(i => (
<div className={styles.inputContainer} key={i}>
<div>
<InputComponent name={`${name}.${i}`} {...props} />
<Button color="danger" onClick={() => remove(i)}>
<FaTimes />
</Button>
</div>
<ErrorMessage
name={`${name}.${i}`}
render={msg => (
<FormFeedback style={{ display: "block" }}>
{msg}
</FormFeedback>
)}
/>
</div>
))}
<Button
color="info"
onClick={() => push("")}
disabled={disabled || form.values[name].slice(-1)[0] === ""}
>
<FaPlus />
</Button>
</div>
)}
但是我收到如下所示的错误消息。消息是一封接一封的来的。我理解,因为我将它包含在我的范围渲染方法中。但是我在里面包含了错误消息组件,因为我也想显示无效电子邮件 ID 的错误。
我在某人的帮助下找到了解决方案。如果有人需要,我记下来吧。
基本上,错误消息组件打印出生成的任何错误消息。它无法从错误消息中区分出哪里和什么。
因此,我利用了 FieldArray 组件的渲染道具中的 form
属性。错误消息以 属性 形式出现,形式为 form.errors
。
然而,区分两个 ErrorMessage 组件的关键是内部 form.errors 以数组形式出现,而外部 form.errors 以字符串形式出现。所以解决方案是检查 form.errors 对象的数据类型。下面是代码片段。
render={({ form, push, remove }) => (
<div>
{range(0, form.values[name].length).map(i => {
return (
<div className={styles.inputContainer} key={i}>
<div>
<InputComponent name={`${name}.${i}`} {...props} />
<Button color="danger" onClick={() => remove(i)}>
<FaTimes />
</Button>
</div>
{typeof form.errors[name] !== "string" && (
<ErrorMessage
name={`${name}.${i}`}
render={msg => {
return (
<FormFeedback style={{ display: "block" }}>
{msg}
</FormFeedback>
);
}}
/>
)}
</div>
);
})}
{typeof form.errors[name] === "string" && (
<ErrorMessage
name={`${name}`}
render={msg => (
<FormFeedback style={{ display: "block" }}>
{msg}
</FormFeedback>
)}
/>
)}
我正在尝试为我的字段数组添加错误消息,它应该包含不同元素的数组。以下是我的验证:
export const emails = yup
.array(
yup
.string()
.matches(/^\S+@\S+$/, {
message: "Must be a valid email id"
})
)
.test("Unique", "Email ids need to be unique", values => {
return new Set(values).size === values.length;
});
这是我的 FieldArray 组件的 render prop 中的 ErrorMessage 组件:
render={({ form, push, remove }) => (
<div>
{range(0, form.values[name].length).map(i => (
<div className={styles.inputContainer} key={i}>
<div>
<InputComponent name={`${name}.${i}`} {...props} />
<Button color="danger" onClick={() => remove(i)}>
<FaTimes />
</Button>
</div>
<ErrorMessage
name={`${name}.${i}`}
render={msg => (
<FormFeedback style={{ display: "block" }}>
{msg}
</FormFeedback>
)}
/>
</div>
))}
<Button
color="info"
onClick={() => push("")}
disabled={disabled || form.values[name].slice(-1)[0] === ""}
>
<FaPlus />
</Button>
</div>
)}
但是我收到如下所示的错误消息。消息是一封接一封的来的。我理解,因为我将它包含在我的范围渲染方法中。但是我在里面包含了错误消息组件,因为我也想显示无效电子邮件 ID 的错误。
我在某人的帮助下找到了解决方案。如果有人需要,我记下来吧。
基本上,错误消息组件打印出生成的任何错误消息。它无法从错误消息中区分出哪里和什么。
因此,我利用了 FieldArray 组件的渲染道具中的 form
属性。错误消息以 属性 形式出现,形式为 form.errors
。
然而,区分两个 ErrorMessage 组件的关键是内部 form.errors 以数组形式出现,而外部 form.errors 以字符串形式出现。所以解决方案是检查 form.errors 对象的数据类型。下面是代码片段。
render={({ form, push, remove }) => (
<div>
{range(0, form.values[name].length).map(i => {
return (
<div className={styles.inputContainer} key={i}>
<div>
<InputComponent name={`${name}.${i}`} {...props} />
<Button color="danger" onClick={() => remove(i)}>
<FaTimes />
</Button>
</div>
{typeof form.errors[name] !== "string" && (
<ErrorMessage
name={`${name}.${i}`}
render={msg => {
return (
<FormFeedback style={{ display: "block" }}>
{msg}
</FormFeedback>
);
}}
/>
)}
</div>
);
})}
{typeof form.errors[name] === "string" && (
<ErrorMessage
name={`${name}`}
render={msg => (
<FormFeedback style={{ display: "block" }}>
{msg}
</FormFeedback>
)}
/>
)}