Невозможно выполнить проверку электронной почты с помощью React Hooks - PullRequest
2 голосов
/ 27 мая 2020

Я новичок в реагировании и программировании. Я пытаюсь реализовать проверку электронной почты с помощью этой платформы. https://upmostly.com/tutorials/form-validation-using-custom-react-hooks.

Желаемый результат: пользователи должны ввести адрес электронной почты, в противном случае под полем ввода будет отображаться красный текст. Если вы думаете, что мне следует использовать другую библиотеку, например, response-hook-forms, сообщите мне

Пожалуйста, ознакомьтесь с моей работой ниже. Заранее спасибо.

Не работает: я все еще нажимаю «Отправить», а сообщение (адрес электронной почты недействителен) не появляется


This is the step where the email should be validated
const Step3 = (props) => {
  const [values, setValues] = useState({});
  const [errors, setErrors] = useState({});
  const [isSubmitting, setIsSubmitting] = useState(false);

  const {
    handleChange,
    handleSubmit,
  } = useForm(validate);

  useEffect(() => {
    if (Object.keys(errors).length === 0 && isSubmitting) {
    }
  }, [errors]);

  const onChange = (event) => {
    event.persist();
    setValues(values => ({ ...values, [event.target.name]: event.target.value }));
  };  
  const onSubmit = (event) => {
    if (event) event.preventDefault();
    setErrors(validate(values));
    setIsSubmitting(true);
  };
  return (
    <WizardStep>
      <WizardProgress className="text-primary">
        Question {props.currentStep}/{props.totalSteps}
      </WizardProgress>
      <StepTitle>What is your email address?</StepTitle>
      <WizardFormWrapper>
        <WizardFormGroup controlId="userEmailGroup">
          <StyledTextInput
            type="email"
            autoComplete="off"
            className={`input ${errors.email && 'is-danger'}`}
            name="email"
            label="Email"
            placeholder="Email"
            onChange={onChange}
            value={values.email}
            required
          />
          {errors.email && (
                    <p className="help is-danger">{errors.email}</p>
                  )}
        </WizardFormGroup>
      </WizardFormWrapper>
      <WizardButtonGroup>
        <Link to="/feed">
          <SubmitButton primary="true" onSubmit={onSubmit}>
            Submit
          </SubmitButton>
        </Link>
      </WizardButtonGroup>
    </WizardStep>
  );
};



This is the validation method 
export default function validate(values) {
  let errors = {};
  if (!values.email) {
    errors.email = 'Email address is required';
  } else if (!/\S+@\S+\.\S+/.test(values.email)) {
    errors.email = 'Email address is invalid';
  }
  if (!values.password) {
    errors.password = 'Password is required';
  } else if (values.password.length < 8) {
    errors.password = 'Password must be 8 or more characters';
  }
  return errors;
};

1 Ответ

1 голос
/ 27 мая 2020

Попробуйте заменить кнопку onSubmit на onClick?

За исключением некоторых неиспользуемых useForm переменных, похоже, что код в порядке. Вот упрощенная версия без дополнительных компонентов и тому подобного. Я не менял никаких основных функций:

const {
  useState,
  useEffect
} = React

const Step3 = (props) => {
  const [values, setValues] = useState({
    email: '',
  });
  const [errors, setErrors] = useState({});
  const [isSubmitting, setIsSubmitting] = useState(false);

  //  const {
  //    handleChange,
  //    handleSubmit,
  //  } = useForm(validate);

  useEffect(() => {
    if (Object.keys(errors).length === 0 && isSubmitting) {}
  }, [errors]);

  const onChange = (event) => {
    event.persist();
    setValues(values => ({ ...values,
      [event.target.name]: event.target.value
    }));
  };
  const onSubmit = (event) => {
    if (event) event.preventDefault();
    setErrors(validate(values));
    setIsSubmitting(true);
  };
  return ( <div>
    <input
    type = "email"
    autoComplete = "off"
    className = "none"
    name = "email"
    label = "Email"
    placeholder = "Email"
    onChange = {
      onChange
    }
    value = {values.email}
    required />
    {
      errors.email && ( <p className = "help is-danger">{errors.email}</p>
      )
    }
    <button type="submit" onClick={onSubmit}>Submit</button>
    </div>
  );
};

function validate(values) {
  let errors = {};
  if (!values.email) {
    errors.email = 'Email address is required';
  } else if (!/\S+@\S+\.\S+/.test(values.email)) {
    errors.email = 'Email address is invalid';
  }
  if (!values.password) {
    errors.password = 'Password is required';
  } else if (values.password.length < 8) {
    errors.password = 'Password must be 8 or more characters';
  }
  return errors;
};

ReactDOM.render( < Step3 / > , document.getElementById("main"))
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<main id="main"></main>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...