本文介绍了Reaction-Hook-Form:使用onBlur模式时验证不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当用户选择5个以上的复选框但未成功时,我尝试使用yup
和react-hook-form
显示错误。
相反,选中第七个复选框时会显示错误。
以下是简化代码:
imports...
const schema = yup.object().shape({
option: yup.array().max(5)
});
function App() {
const { register, handleSubmit, errors } = useForm({
mode: "onBlur",
resolver: yupResolver(schema)
});
const [state, setState] = useState({
wasSubmitted: false
});
const submit = async (data) => {
window.alert(JSON.stringify(data));
};
if (state.wasSubmitted) {
return <p>Congrats</p>;
} else {
return (
<>
<CssBaseline />
<Container maxWidth="sm">
<Typography variant="h2" component="h1">
My form
</Typography>
<form noValidate autoComplete="off" onSubmit={handleSubmit(submit)}>
<FormControl
component="fieldset"
error={!!errors.option}
>
<FormLabel component="legend">
Please select the category or categories of books the child is
interested in:
</FormLabel>
<FormGroup>
<FormControlLabel
control={<Checkbox name="option" inputRef={register} />}
value="Option1"
label="Option 1"
/>
<FormControlLabel
control={<Checkbox name="option" inputRef={register} />}
value="Option2"
label="Option 2"
/>
<FormControlLabel
control={<Checkbox name="option" inputRef={register} />}
label="Option3"
value="Option 3"
/>
<FormControlLabel
control={<Checkbox name="option" inputRef={register} />}
value="Option4"
label="Option 4"
/>
<FormControlLabel
control={<Checkbox name="option" inputRef={register} />}
value="Option5"
label="Option 5"
/>
<FormControlLabel
control={<Checkbox name="option" inputRef={register} />}
value="Option6"
label="Option 6"
/>
<FormControlLabel
control={<Checkbox name="option" inputRef={register} />}
value="Option7"
label="Option 7"
/>
<FormControlLabel
control={<Checkbox name="option" inputRef={register} />}
value="Option8"
label="Option 8"
/>
<FormControlLabel
<FormHelperText>Up to five categories</FormHelperText>
</FormControl>
<Button
type="submit"
disableElevation
>
Submit
</Button>
</form>
</Container>
</>
);
}
}
export default App;
您还可以在此处找到项目的沙箱:
有什么想法吗?
推荐答案
正如@aadlc所说,解决方案是将模式设置为onChange
或all
。我会解释原因的。
来自Reaction-Hook-FormAPI docs:
mode: onChange | onBlur | onSubmit | onTouched | all = 'onSubmit'
onSubmit(默认) | 字符串 | 验证将在submit 事件上触发,无效输入将附加onChange 事件侦听器以重新验证它们。 |
onBlur | 字符串 | 验证将在blur 事件时触发。 |
onChange | 字符串 | 验证将在每个输入的change 事件上触发,并导致多次重新呈现。警告:这通常会对性能产生重大影响。 |
onTouked | 字符串 | 验证将在第一个blur 事件时触发。此后,它将在每个change 事件时触发。 |
全部 | 字符串 | 验证将在blur 和change 事件上触发。 |
在您的代码中,表单模式为onBlur
。这意味着验证是在blur
事件上触发的(取消对输入的关注)。选择选项n+1
时,会从选项n
触发模糊事件。
例如,就在您选择第6个选项(无效)之前,blur
事件将从第5个选项(有效)激发,因为您不再将其作为焦点,并从选项1-5进行验证,因此您必须选中第7个选项才能将该选项从1重新验证为6。
-- select up to 5 options --
select option 4
blur event fires from option 4 -> validate -> pass
select option 5
blur event fires from option 5 -> validate -> pass
select option 6
blur event fires from option 6 -> validate -> fail
select option 7
将验证模式更改为onChange
将在触发change
事件后验证,此时所有值都是最新的:
-- select up to 5 options --
select option 4
blur event fires from option 4
select option 5
change event fires from option 5 -> validate -> pass
blur event fires from option 5
select option 6
change event fires from option 6 -> validate -> fail
blur event fires from option 6
select option 7
change event fires from option 7 -> validate -> fail
将验证模式更改为all
将同时在blur
和change
事件中进行验证,这在此工作流中可能有些过分,但它仍然有效。
这篇关于Reaction-Hook-Form:使用onBlur模式时验证不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!