У меня есть компонент AuthForm, который я использую на обеих страницах / signup и / login, и я различаю их с помощью свойства formType. Страница регистрации нуждается в нескольких дополнительных полях, включая пол и дату рождения (возможно, адрес в будущем), тогда как форма входа может быть довольно простой.
С точки зрения отображения это просто, так как я могу показать или скрыть эти дополнительные поля в зависимости от значения свойства formType. Где это усложняется, с государством.
Я рассмотрел два различных метода управления состоянием: 1) с хуком useFormInput () и 2) с хуком useState в сочетании с объектом состояния (имитируя методологию компонента с состоянием).
Вариант 1:
const useFormInput = (initialValue) => {
const [value, setValue] = useState(initialValue);
function handleChange(e) {
setValue(e.target.value);
}
return {
value,
onChange: handleChange
};
}
const AuthForm = ({ buttonText, formType, onAuth }) => {
const email = useFormInput('');
const password = useFormInput('');
...
const handleSubmit = (e) => {
e.preventDefault();
onAuth(formType, {email, password, etc);
return (
<form onSubmit={handleSubmit}>
<label htmlFor="email">E-mail</label>
<input
id="email"
name="email"
type="text"
{...email}
/>
...
)
};
}
Вариант 2
const AuthForm = ({ buttonText, formType, onAuth }) => {
const [state , setState] = useState({
email : "",
password : "",
firstName: "",
lastName: "",
gender: "",
dob: ""
})
const handleChange = e => {
const {name , value} = e.target;
setState( prevState => ({
...prevState,
[name] : value
}))
}
const handleSubmit = (e) => {
e.preventDefault();
console.log(state);
onAuth(formType, state);
return (
<form onSubmit={handleSubmit}>
<label htmlFor="email">E-mail</label>
<input
id="email"
name="email"
onChange={handleChange}
type="text"
value={state.email}
/>
...
)
};
}
Какой бы метод я ни использовал, я не могу избежать объявления каждой переменной состояния. Когда я устанавливаю состояние = {} в варианте 2, я получаю ошибку об изменении неконтролируемых компонентов на контролируемые компоненты. Когда я объявляю все свои переменные состояния, это означает, что моя форма входа будет иметь пол = "" в состоянии, что затем перезапишет значение в моей базе данных.
Как я могу либо A) избежать полного объявления переменных состояния, либо B) сделать так, чтобы мое окончательное состояние содержало только поля, соответствующие контексту, в котором используется AuthForm?