当前位置: 首页 > 知识库问答 >
问题:

无法使用React钩子解决电子邮件验证问题

许明朗
2023-03-14

我是新来的反应和编程。我试图实现一个电子邮件验证使用这个平台。https://upmostly.com/tutorials/form-validation-using-custom-react-hooks.

期望结果:用户必须输入电子邮件,否则将在输入字段下方显示红色文本。如果您认为我应该使用其他库,如react 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个答案

农鸿德
2023-03-14

尝试将“提交”上的按钮更改为“单击”上的按钮?

除了一些未使用的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>
 类似资料:
  • 我正在提示我的应用程序用户提供电子邮件凭据。 在用户插入电子邮件并通过后,我想验证该帐户。 我正在使用javax。邮政有没有办法验证帐户?只确保凭据确实有效——否则我想显示一个无效用户并传递消息。 也许是某种表演方式: 并在不发送任何内容的情况下检查身份验证异常。

  • 我有一张登记表,上面有姓名、电子邮件和密码。注册时,会向用户的电子邮件地址发送一个确认链接。但在发送链接之前,我需要验证电子邮件地址。我使用了: 它显示的任何电子邮件都有效,例如, 我从获得的电子邮件并将其存储在中。 我到底要怎么做才能让它成功?

  • 问题内容: 我有一个用于用户的Mongoose模式(UserSchema),我想验证电子邮件是否具有正确的语法。我当前使用的验证如下: 但是,这仅检查字段是否为空,而不检查语法。 是否已经存在一些我可以重用的东西,或者我必须提出自己的方法并在validate函数中调用它? 问题答案: 您可以使用正则表达式。 我过去曾经使用过。

  • 每当我在Firebase中使用电子邮件/密码身份验证提供程序时,提供程序都会在成功注册时发送一个无记名令牌,即使是。是否有一种开箱即用的方法将电子邮件/密码身份验证提供程序配置为在用户验证其电子邮件地址之前不发送无记名令牌(并返回403错误)? 请注意,我知道如何创建用户、登录用户、发送验证电子邮件等。。。使用firebase v9。x通过firebase/auth中的方法创建用户(使用Email

  • 问题内容: 我有这个EditText定义: 注意,EditText具有使用电子邮件地址规范定义的inputType。Android是否内置任何可验证电子邮件地址输入类型的内容,还是都必须手动完成?它允许我输入无效数据,所以我对它的用途感到好奇。 谢谢。 问题答案: 在这里,通过输入电子邮件类型,您可以将电子邮件类型的键盘设置为“ @”和“。”。关键字将显示在键盘上。 更好的解决方案是通过以下功能比

  • 我是Firebase的菜鸟。我要求一种设置电子邮件验证的分步指南。 目前,我的应用程序使用基本电子邮件密码登录。我希望对用户进行验证,以便根据用户的电子邮件验证属性隐藏内容。我正在调用.sendEmailVerification(),它会发送到当前用户的电子邮件,但是,每当我单击电子邮件中的链接时,它都说该链接已过期或有人已使用它,这也不会更改属性。我怀疑这与api管理器有关。我目前已将我的网站托