Как проверить поля условной формы в компоненте React?

#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. Что ж, хорошо, что вы смогли найти проблему.