Как объяснялось в других ответах, вам не нужно использовать {}
для повторного переноса user.email
или user.mobile
. Однако ваш onChangeHandler
будет обновлять только поле email
, а не поле mobile
, так как вы обновляете на основе event.target.name
.
Я бы посоветовал вам проверять ввод при нажатии кнопку вместо переключения значения <input />
при каждом вводе пользователя.
Добавьте состояние (скажем, userInput
) и обновите его в onChangeHandler
.
const [userInput, setUserInput] = useState('');
const onChangeHandler = (e) => {
setUserInput(e.target.value);
....
При нажатии кнопки «Зарегистрироваться / Войти» мы проверяем userInput
и действуем соответствующим образом.
const onSubmit = () => {
const isEmail = validateEmail(userInput);
if (isEmail) setUser({...user, email: userInput});
else setUser({...user, mobile: userInput});
// proceed to signin / signup or show an error message
}
Ваш ввод соответственно изменится на
<input
type="text"
value={userInput}
onChange={onChangeHandler}
placeHolder="Mobile Number or Email"
/>
В качестве альтернативы
Если вы хотите обновлять user.email
или user.mobile
при каждом вводе пользователя, вы можете использовать следующий метод onChangeHandler
-
const onChangeHandler = (e) => {
const userInput = e.target.value;
const isEmail = validateEmail(userInput);
if (isEmail) setUser({ ...user, email: userInput, mobile: '' });
else setUser({ ...user, mobile: userInput, email: '' });
}
Ваш ввод будет соответственно изменить на
<input
type="text"
value={user.email || user.mobile}
onChange={onChangeHandler}
placeHolder="Mobile Number or Email"
/>