проверка формы ответа-крючка перед отправкой

У меня есть форма (извините, она такая длинная), в которой пользователю очень просто ввести имя, адрес электронной почты, телефон и комментарии:

    <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>

Все поля проверяются при отправке. Есть ли способ получить формы реакции-крючка для выполнения какой-либо проверки ДО того, как форма будет отправлена? Я бы хотел, чтобы такие флаги, как Angular, были грязными, первозданными и т. Д.


person Kevin Burton    schedule 10.07.2020    source источник


Ответы (2)


Обновлено! API валидатора: https://react-hook-form.com/api/.

Вы можете выбрать значение onBlur вместо режима по умолчанию onSubmit.

Вы можете подписаться на официальную документацию здесь: https://react-hook-form.com/get-started#Registerfields.

Обычно вам нужно register поля для проверки. А затем react-hook-form автоматически подтвердит за вас при отправке.

person ShinaBR2    schedule 10.07.2020
comment
Во-первых, проверка выполняется успешно при отправке. Я хочу, чтобы проверка происходила ПЕРЕД отправкой. Думаю, я нашел одну подсказку. Если я ввожу недопустимое поле и отправляю, проверка формы происходит должным образом. С этого момента проверка также происходит ДО отправки, как я хотел. Однако, если я ввожу недопустимое поле и просто меняю фокус (вкладка на другое поле), проверка не выполняется. Компонент Controller (часть пакета react-hook-form) обрабатывает register за меня. - person Kevin Burton; 11.07.2020
comment
@KevinBurton, вы нашли решение описанного вами поведения? Я также сталкиваюсь с точно такой же проблемой. Спасибо - person Ashish Saini; 24.07.2020
comment
@AshishSaini Я пока не нашел решения. Дай мне знать, если найдешь что-нибудь. - person Kevin Burton; 25.07.2020
comment
@KevinBurton, извините за поздний ответ. Можете ли вы взглянуть здесь: react-hook-form.com/api. Они предлагают mode, вы можете указать значение onBlur для этой проверки. Обновил и мой ответ. - person ShinaBR2; 25.07.2020
comment
Да, я заставил это работать. Я использовал useForm({mode: 'all'}), чтобы он заработал. В любом случае спасибо. - person Ashish Saini; 25.07.2020

Я не использовал формы response-hook, но использовал обработчики событий onblur для проверки отдельных полей перед отправкой.

person David Polansky    schedule 10.07.2020