提交前的react-hook-form验证

Kev*_*ton 29 material-ui react-hook-form

我有一个表单(抱歉太长了),用户输入姓名、电子邮件、电话、评论非常简单:

    <form
        className={classes.root}
        data-testid="getting-started-form"
        onSubmit={handleSubmit(onSubmit)}
    >
        <div style={{ width: '400px' }}>
            <div style={{ width: '100%'}}>
                <Controller as={<TextField
                    label="Name"
                    id="name"
                    name="name"
                    type="text"
                    value={name}
                    placeholder="Name"
                    onChange={(e: React.FormEvent<EventTarget>) => {
                        let target = e.target as HTMLInputElement;
                        setName(target.value);
                    }}
                    inputProps={{
                        'data-testid': 'name'
                    }}
                />} name="name" rules={{ required: true }} control={control}
                />
                {errors.name && <span>Name is required</span>}
            </div>
            <div style={{ width: '100%' }}>
                <Controller as={<TextField
                    label="Email"
                    id="email"
                    name="email"
                    type="text"
                    value={email}
                    placeholder="Email"
                    style={{ width: '100%' }}
                    onChange={(e: React.FormEvent<EventTarget>) => {
                        let target = e.target as HTMLInputElement;
                        setEmail(target.value);
                    }}
                    inputProps={{
                        'data-testid': 'email'
                    }}
                />} name="email" rules={{ required: true, pattern: /^\w+[\w-\.]*\@\w+((-\w+)|(\w*))\.[a-z]{2,3}$/i }} control={control}
                />
                {errors.email && <span>Email is required</span>}
            </div>
            <div style={{ width: '30%' }}>
                <Controller as={<TextField
                    label="Phone"
                    id="phone"
                    name="phone"
                    type="text"
                    value={phone}
                    placeholder="eg.15556667890"
                    onChange={(e: React.FormEvent<EventTarget>) => {
                        let target = e.target as HTMLInputElement;
                        setPhone(target.value);
                    }}
                    inputProps={{
                        'data-testid': 'phone'
                    }}
                />} name="phone" rules={{ pattern: /\d{11}/ }} control={control}
                />
            </div>
            <div style={{ width: '30%' }}>
                <Controller as={<TextField
                    label="Comments"
                    id="comments"
                    name="comments"
                    type="text"
                    value={comments}
                    placeholder="Comments"
                    rows={6}
                    multiline
                    onChange={(e: React.FormEvent<EventTarget>) => {
                        let target = e.target as HTMLInputElement;
                        setComments(target.value);
                    }}
                    inputProps={{
                        'data-testid': 'comments'
                    }}
                />} name="comments" control={control}
                />
            </div>
        </div>
        <Button
            type="submit"
            aria-label="submit getting-started-form"
            variant="contained"
            color="primary"
            data-testid="getting-started-form-submit-button"
        >
            Submit
        </Button>
    </form>
Run Code Online (Sandbox Code Playgroud)

所有字段在提交时都会经过验证。无论如何,有没有办法让react-hook-forms在提交表单之前进行某种验证?我想要像 Angular 那样的标志来表示脏的、原始的等。

Shi*_*BR2 23

更新!验证器 API: https: //react-hook-form.com/api/

您可以选择该值onBlur而不是默认onSubmit模式。

您可以在这里关注官方文档:https ://react-hook-form.com/get-started#Registerfields 。

基本上您需要register验证字段。然后react-hook-form将在提交时自动为您验证。

  • 是的,我成功了。我使用 useForm({mode: 'all'})` 来使其工作。不管怎么说,多谢拉。 (19认同)
  • 首先,验证在提交时成功进行。我想要的是在提交之前进行验证。我想我找到了一条线索。如果我输入无效字段并提交表单验证会按预期发生。从那时起,验证也会按照我的意愿在提交之前进行。但是,如果我输入无效字段并简单地更改焦点(选项卡到另一个字段),则不会进行验证。“Controller”(“react-hook-form”包的一部分)组件为我处理“register”。 (3认同)

小智 15

使用模式我们可以这样做:

模式: onChange | 模糊 | 提交 | 触碰 | all = 'onSubmit'(React Native:与控制器兼容)

const { register, trigger, handleSubmit, watch, formState: { errors } } = useForm({
    mode: 'all', // THIS WILL ALLOW ALL-TIME VALIDATION (May have performance impact)
    resolver: yupResolver(ValidationSchema),
  });
Run Code Online (Sandbox Code Playgroud)