#javascript #reactjs #react-hooks #material-ui
Вопрос:
Я новичок в реагировании, и я пытался создать функциональный компонент формы входа, который изменяет свою структуру на основе логической опоры, которую можно переключать между входом в систему и регистрацией. В версии регистрации есть дополнительное текстовое поле Confirm password
, которое необходимо проверить с помощью поля пароля для соответствия. Ниже приведена функция проверки для компонента.
export function SignInForm({login}) {
const [values, setValues] = useState({});
const [error, setErrors] = useState({});
const validate = (values) => {
console.log(login)
let errors = {}
if (!values.email) {
errors.email = "Email address is required";
} else if (!/S @S .S /.test(values.email)) {
errors.email = "Invalid email address";
}
if (!values.password) {
errors.password = "Password is required";
} else if (values.password.length < 2) {
errors.password = "Password should be 2 or more characters";
}
if (!values.confirmPass) {
errors.confirmPass = "This field is required";
} else if (values.confirmPass !== values.password) {
errors.confirmPass = "Passwords do not match";
}
return errors;
}
const handleChange = (event) => {
event.persist();
setValues(values => ({ ...values, [event.target.name]: event.target.value }));
};
const submitChange = (event) => {
event.preventDefault();
setErrors(validate(values))
}
...
И следующее-возвращающийся JSX.
<form className={classes.form} onSubmit={submitChange}>
<TextField
variant="outlined"
margin="normal"
required
fullWidth
id="email"
label="Email Address"
name="email"
autoComplete="email"
autoFocus
value={values.email}
onChange={handleChange}
error={Boolean(error.email)}
helperText={error.email}
/>
<TextField
...
value={values.password}
onChange={handleChange}
error={Boolean(error.password)}
helperText={error.password}
/>
{!login amp;amp;
<TextField
...
value={values.confirmPass}
onChange={handleChange}
error={Boolean(error.confirmPass)}
helperText={error.confirmPass}
/>}
Атрибуты «…» являются общими для первого текстового поля, остальная часть формы не отображается, поскольку они не являются частью проблемы.
При запуске версии регистрации (login == false) поле подтверждения пароля остается на «Это поле обязательно», даже если я помещаю в него значения. Он не выполняет проверку. Но другие поля проверяются просто отлично.
Что я здесь делаю не так? И как я могу решить эту проблему? Любая зацепка будет оценена по достоинству. Спасибо.
Комментарии:
1. это происходит потому,
values.confirmPass
что, даже если он не назначен какому-либо элементу, в состоянии пусто, а если пусто, это приводит к ошибке
Ответ №1:
Ответом для вас является фрагмент кода
if(!login) {
if (!values.confirmPass) {
errors.confirmPass = "This field is required";
} else if (values.confirmPass !== values.password) {
errors.confirmPass = "Passwords do not match";
}
}
Существует еще одна проблема, связанная с тем, что вы должны установить начальное состояние своих компонентов
const [values, setValues] = useState({
confirmPass: null,
password: null,
email: null,
});
const [error, setErrors] = useState({
confirmPass: null,
password: null,
email: null,
});
У меня есть для вас хорошее предложение: попробуйте использовать что-то для управления вашими формами, как formik, и проверки схемы, как yup. Ваш код будет намного более понятным и простым в обслуживании
Ответ №2:
вы можете попробовать это
if(!login) {
if (!values.confirmPass) {
errors.confirmPass = "This field is required";
} else if (values.confirmPass !== values.password) {
errors.confirmPass = "Passwords do not match";
}
}
Так как при входе в систему значение false, values.confirmPass пусто.
Комментарии:
1. этого не должно быть, если(!войти в систему) ? так что это работает только при регистрации ?
2. Именно это я и хотел сказать, извини. Я уже отредактировал его. Спасибо!
3. Это все равно не работает. При отправке я получаю ошибку «это поле обязательно», даже если поле заполнено
4. Очевидно, это была моя вина.
name
тег должен иметь то же имя,values
что и имя свойства. Для подтверждения пароляvalue={values.confirmPass}
иname="Confirm password"
не совпало. изменение обоих наconfirmPass
сработало.5. Что ж, хорошо, что вы смогли найти проблему.