Я пытаюсь выполнить проверку формы с помощью формы реакции-крючка. Он отлично работает, за исключением одной проблемы: он не проверяет тип ввода. Я хочу, чтобы пользователь вводил только URL-адрес, но эта вещь проверяет его как простой текст. Где я ошибся?
function EditAvatarPopup({ isOpen, onClose, onUpdateAvatar, submitButtonName }) {
const { register, formState: { errors }, handleSubmit } = useForm();
const [link, setLink] = useState('');
function handleInput(e) {
setLink(e.target.value)
}
function handleSubmitButton() {
console.info(link)
onUpdateAvatar({
avatar: link
});
}
return (
<PopupWithForm
name = "change-avatar"
title = "Update avatar"
submitName = { submitButtonName }
isOpen = { isOpen }
onClose = { onClose }
onSubmit = { handleSubmit(() => handleSubmitButton() ) }
>
<label htmlFor = "userAvatar" className = "form__form-field">
<input
id = "userAvatar"
type = "url"
{ ...register('userAvatar', {
required: "Enter URL link",
value: link
})
}
placeholder = "url link"
className = "form__input"
onChange = { handleInput }
/>
{ errors.userAvatar && (<span className = "form__error">{ errors.userAvatar.message }</span>) }
</label>
</PopupWithForm>
);
}
Похоже, type = "url" не работает, но я не могу понять, почему





Вот минимальный рабочий пример: https://codesandbox.io/s/react-hook-form-js-forked-ml3zx?file=/src/App.js
Я рекомендую не перезаписывать реквизиты onChange, вместо использования const [link, setLink] = useState(''); вы можете использовать const link = watch('userAvatar').
Вы можете удалить свойство value, это не обязательно:
<input
id = "userAvatar"
type = "url"
{ ...register('userAvatar', {
required: "Enter URL link",
value: link //⬅️ Remove that line
})
}
placeholder = "url link"
className = "form__input"
onChange = { handleInput } //⬅️ Remove that line
/>