繁体   English   中英

在React中切换输入字段表单验证

[英]Switching input field form validation in react

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

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”键时,这些字段就应该得到验证,我不想在用户键入时但在用户切换输入时进行验证领域。 如何实现上述行为? 非常感谢!

PS-如果不使用redux-forms之类的库就可以实现这一点,那就更好了。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM