【问题标题】:How do I get my error message to go away after form validation in react js?在 react js 中进行表单验证后,如何让我的错误消息消失?
【发布时间】:2022-01-24 14:07:31
【问题描述】:

我有一个输入用户电子邮件和用户密码的简单登录表单,目标是在输入字段下直接弹出错误消息,并且只有在输入字段为空或模式是错误的。我的输入字段中只有一个运行正常。 (输入字段似乎相互依赖?)任何帮助将不胜感激!

一旦密码满足要求,另一个输入字段的红色边框将被移除,但错误消息仍然存在。目标是同时删除红色边框和错误消息

class Login extends Component {
  constructor(props) {
    super(props);

    this.emailInput = React.createRef();
    this.passwordInput = React.createRef();

    this.state = {
      email: "",
      password: "",
      emailError: false,
      passwordError: false,
    };
    this.handleSubmit = this.handleSubmit.bind(this);
    this.handleInputChange = this.handleInputChange.bind(this);
    this.validate = this.validate.bind(this);
  }

  handleInputChange(e) {
    const { value, name } = e.target;
    this.setState({ [name]: value });
    console.log(value);
  }

  validateEmail(userEmail) {
    const emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
    return emailPattern.test(userEmail);
  }

  validatePassword(userPassword) {
    const passwordPattern =
      /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{8,})/;
    return passwordPattern.test(userPassword);
  }

  styleBorderEmail(emailInput, styles) {
    this.emailInput.current.style.border = styles;
  }

  styleBorderPassword(passwordInput, styles) {
    this.passwordInput.current.style.border = styles;
  }

  validate() {
    let emailError = this.email;
    let passwordError = this.password;

    if (!this.validateEmail(this.state.email)) {
      emailError = "email not valid";
      this.styleBorderEmail(this.emailInput, "1px solid red");
    } else {
      this.styleBorderEmail(this.emailInput, "1px solid black");
    }
    if (!this.validatePassword(this.state.password)) {
      passwordError = "password not valid";
      this.styleBorderPassword(this.passwordInput, "1px solid red");
    } else {
      this.styleBorderPassword(this.passwordInput, "1px solid black");
    }
    if (emailError || passwordError) {
      this.setState({ emailError, passwordError });
      return false;
    }
    return true;
  }

  handleSubmit(e) {
    e.preventDefault();
    const isValid = this.validate();

    if (isValid) {
      alert("successful submit");

      // clears the form after it's been submitted
      this.setState({
        email: "",
        password: "",
        emailError: false,
        passwordError: false,
      });
    }
  }

  render() {
    return (
      <div className="login-component">
        <div className="login-container">
          <h2>Welcome Back!</h2>
          <br />
          <form onSubmit={this.handleSubmit}>
            <div className="login-group">
              <label htmlFor="email" className="login-label">
                Your email
              </label>
              <input
                className="login-input"
                type="text"
                name="email"
                id="email"
                placeholder="Enter your email"
                value={this.state.email}
                onChange={this.handleInputChange}
                onKeyUp={this.validate}
                ref={this.emailInput}
              />
              {this.state.emailError && (
                <span className="error-login">
                  Please enter a valid email address
                </span>
              )}
            </div>
            <div className="login-group">
              <label htmlFor="password" className="login-label">
                Password
              </label>
              <input
                className="login-input"
                type="password"
                name="password"
                id="password"
                placeholder="Enter your password"
                value={this.state.password}
                onChange={this.handleInputChange}
                onKeyUp={this.validate}
                ref={this.passwordInput}
              />
              {this.state.passwordError && (
                <span className="error-login">Please enter a password</span>
              )}
            </div>
            <div>
              <button type="submit" className="login-btn">
                Login
              </button>
            </div>
          </form>
        </div>
      </div>
    );
  }
}

export default Login;

【问题讨论】:

    标签: javascript reactjs validation input user-input


    【解决方案1】:

    需要在验证函数中添加一行代码this.setState({ emailError: "", passwordError: "" });,才能返回true。

    新的验证函数如下所示

    validate() {
        let emailError = this.email;
        let passwordError = this.password;
    
        if (!this.validateEmail(this.state.email)) {
          emailError = "email not valid";
          this.styleBorderEmail(this.emailInput, "1px solid red");
        } else {
          this.styleBorderEmail(this.emailInput, "1px solid black");
        }
        if (!this.validatePassword(this.state.password)) {
          passwordError = "password not valid";
          this.styleBorderPassword(this.passwordInput, "1px solid red");
        } else {
          this.styleBorderPassword(this.passwordInput, "1px solid black");
        }
        if (emailError || passwordError) {
          this.setState({ emailError, passwordError });
          return false;
        }
        this.setState({ emailError: "", passwordError: "" }); // New line added
        return true;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-22
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 2017-05-12
      • 1970-01-01
      相关资源
      最近更新 更多