【问题标题】:Switching input field form validation in react在反应中切换输入字段表单验证
【发布时间】:2019-08-08 08:48:39
【问题描述】:

目前,在我的表单中,只要用户输入内容,输入字段就会得到验证。这是代码-

index.js

import React from "react";
import ReactDOM from "react-dom";
import ShowError from "./ShowError";
import "./styles.css";

class App extends React.Component {
  state = {
    email: "",
    name: "",
    mobile: "",
    errors: {
      email: "",
      name: "",
      mobile: ""
    },
    nameError: false,
    emailError: false,
    mobileError: false,
    formError: false
  };

  showMsg = () => {
    if (!this.state.formError) {
      alert("Error");
    }
  };
  validateFunc = (name, value) => {
    let error = this.state.errors;
    let nameError = this.state.nameError;
    let emailError = this.state.emailError;
    let mobileError = this.state.mobileError;
    switch (name) {
      case "name":
        nameError = !/^[a-zA-Z ]+$/.test(value);
        error.name = nameError ? " is Invalid" : "";
        break;
      case "email":
        emailError = !/^([\w.%+-]+)@([\w-]+\.)+([\w]{2,})$/i.test(value);
        error.email = emailError ? " is Invalid" : "";
        break;
      case "mobile":
        mobileError = !/^[0-9]{10}$/.test(value);
        error.mobile = mobileError ? " is Invalid" : "";
        break;
    }
    this.setState({
      errors: error,
      nameError: nameError,
      emailError: emailError,
      mobileError: mobileError
    });
  };

  handleInput = event => {
    const name = event.target.name;
    const value = event.target.value;
    this.setState(
      {
        [name]: value
      },
      this.validateFunc(name, value)
    );
  };
  handleSubmit = event => {
    event.preventDefault();
    let formError =
      this.state.nameError || this.state.emailError || this.state.mobileError;
    this.setState({
      formError: formError
    });
  };
  render() {
    return (
      <div className="App">
        <h1>Basic Form Validation</h1>
        <form className="FormStyle">
          <input
            className="FieldStyle"
            type="text"
            name="name"
            placeholder="Name"
            onChange={event => this.handleInput(event)}
          />
          <input
            className="FieldStyle"
            type="email"
            name="email"
            placeholder="Email"
            onChange={event => this.handleInput(event)}
          />
          <input
            className="FieldStyle"
            type="number"
            name="mobile"
            placeholder="Mobile"
            onChange={event => this.handleInput(event)}
          />
          <button
            className="FieldStyle"
            type="submit"
            onClick={event => this.handleSubmit(event)}
          >
            SUBMIT
          </button>
        </form>
        <ShowError error={this.state.errors} />
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

ShowError.js

import React from "react";

const ShowError = props => {
  return Object.keys(props.error).map((field, index) => {
    if (props.error[field].length > 0) {
      return (
        <p key={index}>
          {field} {props.error[field]}
        </p>
      );
    } else {
      return "";
    }
  });
};

export default ShowError;

预期行为 - 我想要的是,一旦用户关注下一个输入字段或按下“tab”键,我不想在用户输入时验证字段,但当用户切换字段。我怎样才能实现上述行为?非常感谢!

附: - 如果我能在不使用 redux-forms 之类的库的情况下实现这一点会更好。

【问题讨论】:

    标签: javascript reactjs forms redux


    【解决方案1】:

    使用 onBlur 以便在用户离开组件时触发事件

      onBlur={event => this.handleInput(event)}
    

    【讨论】:

    • 你试过了吗?这行得通吗?在input 上使用type 属性将指示浏览器使用HTML5 表单验证。您可能想将novalidate 添加到form,然后需要自己进行验证。
    猜你喜欢
    • 2018-03-13
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多