使用onBlur模式时验证不起作用

使用onBlur模式时验证不起作用

本文介绍了Reaction-Hook-Form:使用onBlur模式时验证不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当用户选择5个以上的复选框但未成功时,我尝试使用yupreact-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所说,解决方案是将模式设置为onChangeall。我会解释原因的。

来自Reaction-Hook-FormAPI docs

mode: onChange | onBlur | onSubmit | onTouched | all = 'onSubmit'

onSubmit(默认)字符串验证将在submit事件上触发,无效输入将附加onChange事件侦听器以重新验证它们。
onBlur字符串验证将在blur事件时触发。
onChange字符串验证将在每个输入的change事件上触发,并导致多次重新呈现。警告:这通常会对性能产生重大影响。
onTouked字符串验证将在第一个blur事件时触发。此后,它将在每个change事件时触发。
全部字符串验证将在blurchange事件上触发。

在您的代码中,表单模式为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将同时在blurchange事件中进行验证,这在此工作流中可能有些过分,但它仍然有效。

这篇关于Reaction-Hook-Form:使用onBlur模式时验证不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-31 18:18