почему первая буква мертва при вводе формы реакции-хука

Мне нужна помощь, чтобы понять, почему первая буква в простом компоненте ввода не зарегистрирована.

Я создал простой контролируемый ввод из примеров, но он не работает должным образом.

я создал для вас пример https://stackblitz.com/edit/react-9zezqx

const App = () => {

const { register, handleSubmit, watch, errors, reset, control, formState } = useForm({ mode: 'onChange' });

console.log(errors)
    return (
      <div>
        <form onSubmit={handleSubmit(() => console.log("submit"))}>
            <Controller
                as={TextInput}
                name="firstname"
                defaultValue=""
                control={control}
                inputRef={register({ required: true, minLength: 8 })}
                hasErrors={errors.firstname !== undefined}
            />
            <br/>
            <Controller
                as={TextInput}
                name="hobby"
                defaultValue=""
                control={control}
                inputRef={register({ required: true, minLength: 8 })}
                hasErrors={errors.hobby !== undefined}
            />
            </form>
      </div>
    );

}

render(<App />, document.getElementById('root'));



import * as React from 'react';

export const TextInput = (props) => {
  return(
    <>
    <input    
      type="text"
      name={props.name}
      value={props.value}
      onChange={props.onChange}
      ref={props.inputRef}
     />
     {props.hasErrors && (<h2>errors!!</h2>)}
     </>
  )
}

person Oygen87    schedule 10.04.2020    source источник


Ответы (4)


Хорошо, я нашел ошибку, вызывающую это, и в «onBlur»

reValidateMode: 'onBlur'
person Oygen87    schedule 10.04.2020

Поменяйте режим на onBlur, это улучшит производительность, сработает только тогда, когда пользователь покинет поле, что и должно произойти, а также не проглотит первый ввод.

onChange пропускает первую букву, потому что для начального вызова onChange будет использоваться значение по умолчанию, которое пусто.

person Domino987    schedule 10.04.2020
comment
я предпочитаю onBlur, но проблема все еще возникает там после того, как вы размыли и не выполнили требования для проверки этого поля, и вы все стираете и пытаетесь напечатать снова, проверьте мою ссылку и убедитесь сами - person Oygen87; 10.04.2020

Вероятно, вы используете неконтролируемый ввод. В этом случае используйте defaultValue вместо value.

Ссылка

person Alvaro    schedule 08.02.2021

Вот в чем проблема, вы пытаетесь использовать контроллер с регистром:

https://react-hook-form.com/api#Controller

<Controller
  as={TextInput}
  name="hobby"
  defaultValue=""
  control={control}
/>

or

https://react-hook-form.com/api#register

<TextInput inputRef={register} />
person Bill    schedule 11.04.2020
comment
Во второй ссылке нет inputRef? - person BvuRVKyUVlViVIc7; 14.04.2020
comment
потому что это реквизит MUI - person Bill; 15.04.2020