Material ui Formik/Yup验证中的重复错误

Material ui Formik/Yup验证中的重复错误,material-ui,formik,yup,formik-material-ui,Material Ui,Formik,Yup,Formik Material Ui,我在Formik中使用以下验证模式: validationSchema={ 是的({ 电子邮件:是的,数组() .of(Yup.string().email('请仅输入有效的电子邮件地址')) .min(1,“至少需要一个电子邮件地址”。) }) } 它工作得非常好,只是因为我使用的是一个Material UI组件,当用户输入多个无效的电子邮件地址时,他们会在每个无效的电子邮件地址中看到一次错误消息 有办法吗 这里有一个沙盒链接:然后您要做的是确保过滤掉重复的错误。您应该确保每个错误消息都是

我在Formik中使用以下验证模式:


validationSchema={
是的({
电子邮件:是的,数组()
.of(Yup.string().email('请仅输入有效的电子邮件地址'))
.min(1,“至少需要一个电子邮件地址”。)
})
}
它工作得非常好,只是因为我使用的是一个Material UI组件,当用户输入多个无效的电子邮件地址时,他们会在每个无效的电子邮件地址中看到一次错误消息

有办法吗


这里有一个沙盒链接:

然后您要做的是确保过滤掉重复的错误。您应该确保每个错误消息都是唯一的。我写了一个函数来帮助你做到这一点

我更新了您的
EmailsField
组件:

从“React”导入React;
从“@material ui/lab/Autocomplete”导入自动完成;
从“@material ui/core/Chip”导入芯片;
从“@material ui/icons/Close”导入CloseIcon;
从“@material ui/core/TextField”导入TextField;
从“formik”导入{FieldProps};
const isEmailValid=(电子邮件:字符串)=>
/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(电子邮件);
常量EmailsField=({
领域
格式:{errors,toucted,settoucted,setFieldValue},
…道具
}:野外道具)=>{
console.log('errors',errors)
const name=field.name;
const[value,setValue]=React.useState([]);
常量[inputValue,setInputValue]=React.useState(“”);
const handleChange=(事件:React.changevent,电子邮件:string[])=>{
setTouched({…touched,[名称]:true});
设定值(电子邮件);
event.persist();
setFieldValue(姓名、电子邮件);
};
常量handleInputChange=(
事件:React.ChangeEvent,
newInputValue:字符串
) => {
const options=newInputValue.split(/[,]+/);
常量字段值=值
.concat(选项)
.map(x=>x.trim())
.filter(x=>x);
如果(options.length>1){
handleChange(事件、字段值);
}否则{
设置输入值(newInputValue);
}
};
//1.此功能将帮助删除重复的错误
const getEmailErrors=(错误:任意)=>{
返回数组.isArray(错误)
?错误。筛选器((电子邮件:字符串,i:number,arr:any)=>arr.indexOf(电子邮件)==i)
:错误;
}
返回(
email.map((电子邮件,索引)=>(
))
}
value={value}
inputValue={inputValue}
onChange={handleChange}
onInputChange={handleInputChange}
renderInput={params=>(
>>>叫这里
helperText={toucted[name]&&errors.emails&&getEmailErrors(errors.emails,如有)}
variant=“概述”
InputProps={{…params.InputProps}
{…道具}
/>
)}
/>
);
};
导出默认EmailsField;

然后要做的是确保过滤掉重复的错误。您应该确保每个错误消息都是唯一的。我写了一个函数来帮助你做到这一点

我更新了您的
EmailsField
组件:

从“React”导入React;
从“@material ui/lab/Autocomplete”导入自动完成;
从“@material ui/core/Chip”导入芯片;
从“@material ui/icons/Close”导入CloseIcon;
从“@material ui/core/TextField”导入TextField;
从“formik”导入{FieldProps};
const isEmailValid=(电子邮件:字符串)=>
/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(电子邮件);
常量EmailsField=({
领域
格式:{errors,toucted,settoucted,setFieldValue},
…道具
}:野外道具)=>{
console.log('errors',errors)
const name=field.name;
const[value,setValue]=React.useState([]);
常量[inputValue,setInputValue]=React.useState(“”);
const handleChange=(事件:React.changevent,电子邮件:string[])=>{
setTouched({…touched,[名称]:true});
设定值(电子邮件);
event.persist();
setFieldValue(姓名、电子邮件);
};
常量handleInputChange=(
事件:React.ChangeEvent,
newInputValue:字符串
) => {
const options=newInputValue.split(/[,]+/);
常量字段值=值
.concat(选项)
.map(x=>x.trim())
.filter(x=>x);
如果(options.length>1){
handleChange(事件、字段值);
}否则{
设置输入值(newInputValue);
}
};
//1.此功能将帮助删除重复的错误
const getEmailErrors=(错误:任意)=>{
返回数组.isArray(错误)
?错误。筛选器((电子邮件:字符串,i:number,arr:any)=>arr.indexOf(电子邮件)==i)
:错误;
}
返回(
email.map((电子邮件,索引)=>(
))
}
value={value}
inputValue={inputValue}
onChange={handleChange}
onInputChange={handleInputChange}
renderInput={params=>(
>>>叫这里
helperText={toucted[name]&&errors.emails&&getEmailErrors(errors.emails,如有)}
variant=“概述”
InputProps={{…params.InputProps}
{…道具}
/>
)}
/>
);
};
导出默认EmailsField;

在复制此错误的codesandbox上共享您的代码。我用链接更新了问题。如果我的答案有帮助,您可以将其标记为接受的答案吗?在复制此错误的codesandbox上共享您的代码。我用链接更新了问题。如果我的答案有帮助,您可以将其标记为接受的答案吗?