Задать вопрос
@luxurypluxury

Почему не работает onChange с react-hook-forms?

onChange просто не работает при загрузке файлов в инпут, но если убрать {...register('avatar')}, то всё работает.

Вот код компонента загрузки аватара:
const UploadAvatar = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(({ ...props }, ref) => {
    const avatarUrl = useSelector(userDataSelector)?.avatarUrl;
    const [previewUrl, setPreviewUrl] = useState<string>('');
    const [sizeError, setSizeError] = useState<boolean>(false);


    const handleFileChange = (e: ChangeEvent<HTMLInputElement>) => {
        const file = e.target.files && e.target.files[0];

        if (file && file.size > 2 * 1024 * 1024) {
            setSizeError(true);
            return;
        }

        setPreviewUrl(file ? URL.createObjectURL(file) : '');
        setSizeError(false);
    }

    return (
        <div className={styles.upload}>
            {avatarUrl &&
                <>
                    <Image
                        className={styles.upload__avatar}
                        src={previewUrl ? previewUrl : avatarUrl}
                        alt="avatar"
                        width={120}
                        height={120}
                    />
                    <label className={styles.upload__label}>
                        <input
                            ref={ref}
                            onChange={(e) => handleFileChange(e)}
                            {...props}
                        />
                        <Image
                            src={'/icons/photo.svg'}
                            width={24}
                            height={24}
                            alt=''
                        />
                    </label>
                </>
            }
            {sizeError &&
                <span className={styles.upload__error}>
                    File should be at least 2MB
                </span>
            }
        </div>
    )
})


Вот сама форма:
const schema = Joi.object({
        avatar: Joi.object(),
        username: Joi.string().min(5).max(16).required().pattern(/^(?=.*[a-zA-Z])[a-zA-Z0-9]+$/).messages({
            'string.empty': 'Username is required',
            'string.min': 'Too short',
            'string.max': 'Too long',
            'string.pattern.base': 'Username should be least at one character',
        })
    });

    const onSubmit: SubmitHandler<TFormValues> = async (data) => {
        console.log(data);
        try {
            // await signUp(data);
            // router.push('/home');
        } catch (err: any) {
            console.error(err);
        }
    }

    return (
        <form
            className={styles.form}
            encType="multipart/form-data"
            onSubmit={handleSubmit(onSubmit)}
        >
            <UploadAvatar
                {...register('avatar')}
                type="file"
                accept="image/*"
            />
            <InputField
                required
                type='text'
                placeholder='Username'
                error={errors.username?.message}
                {...register('username')}
            />
            <Button
                variant='primary'
                size='lg'
                type='submit'
                disabled={!isValid}
            >
                Done
            </Button>
        </form>
    )
  • Вопрос задан
  • 211 просмотров
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Нетология
    Frontend-разработка на React
    10 недель
    Далее
  • Академия Eduson
    React-разработчик
    2 месяца
    Далее
Решения вопроса 1
@mvn-h24
onChange просто не работает при загрузке файлов в инпут, но если убрать {...register('avatar')}, то всё работает.


Необходимо настроить onChange через register
6597c307269f1185332285.png

или Controller
6597c36d0aa03759456144.png
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
ITK academy Екатеринбург
от 50 000 до 90 000 ₽
от 250 000 до 300 000 ₽