验证 React 中的表单输入字段

IT技术 twitter-bootstrap validation reactjs
2021-05-20 23:50:50
<div className="form-group">
  <label className="col-sm-0 control-label"> Name : &nbsp; </label>
  <input
    type="text"
    value={this.state.UserName}
    onChange={this.handleChangeUserName}
    placeholder="Name"
    pattern="[A-Za-z]{3}"
    className="form-control"
  />
</div>

嗨,我正在尝试使用模式验证来验证 React 中的表单输入字段。但它不起作用。我使用的验证就像pattern="[A-Za-z]{3}".

请让我知道如何解决这个问题。将验证放在 React Bootstrap 组件中。

3个回答

您正在使用input元素的 value 属性(表示受控组件)并更新onChange方法中的状态,因此您可以轻松地测试此正则表达式onChange并仅在输入有效时更新状态。

像这样:

handleChangeUserName(e){
   if(e.target.value.match("^[a-zA-Z ]*$") != null){
       this.setState({UserName: e.target.value});
   }
} 

检查工作代码:

class HelloWidget extends React.Component {
  
  constructor(){
    super();
    this.state={UserName:''}
    this.handleChangeUserName = this.handleChangeUserName.bind(this);
  }
  
  handleChangeUserName(e){
    if(e.target.value.match("^[a-zA-Z ]*$")!=null) {
      this.setState({UserName: e.target.value});
    }
  }

  render(){
    return(
      <div className="form-group">
        <label className="col-sm-0 control-label" htmlFor="textinput"> Name : &nbsp; </label>
        <input type="text" value={this.state.UserName} onChange={this.handleChangeUserName}  placeholder="Name" className="form-control"></input>
      </div>
    )
  }
}
  
ReactDOM.render(<HelloWidget/>, document.getElementById('container'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id='container' />

检查jsfiddle工作示例:https : //jsfiddle.net/uL4fj4qL/11/

勾选此jsfiddleMaterial-Ui snackbar加入到显示错误,如果用户尝试输入错误的值:https://jsfiddle.net/4zqwq1fj/

pattern="[A-Za-z]{3}"HTML5 的一项功能

完整的解决方案在这里:https : //codepen.io/tkrotoff/pen/qypXWZ?editors=0010

如果您只想使用默认的 HTML5 验证:

class FormValidate extends React.Component {
  state = {
    username: ''
  };

  handleUsernameChange = e => {
    console.log('handleUsernameChange()');
    this.setState({
      username: e.target.value
    });
  }

  handleSubmit = e => {
    console.log('handleSubmit() Submit form with state:', this.state);
    e.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <div className="form-group">
          <label htmlFor="username">Name</label>
          <input
            id="username"
            name="username"
            value={this.state.username}
            onChange={this.handleUsernameChange}
            placeholder="Name"
            pattern="[A-Za-z]{3}"
            className="form-control" />
        </div>

        <button className="btn btn-primary">Submit</button>
      </form>
    );
  }
}

无效的输入 FormValidate

如果您想更好地与Bootstrap 4集成

class FormNoValidate extends React.Component {
  state = {
    username: '',
    error: ''
  };

  handleUsernameChange = e => {
    console.log('handleUsernameChange()');
    const target = e.target;
    this.setState({
      username: target.value,
      error: target.validationMessage
    });
  }

  handleSubmit = e => {
    console.log('handleSubmit() Submit form with state:', this.state);
    e.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit} noValidate>
        <div className="form-group">
          <label htmlFor="username">Name</label>
          <input
            id="username"
            name="username"
            value={this.state.username}
            onChange={this.handleUsernameChange}
            placeholder="Name"
            pattern="[A-Za-z]{3}"
            className="form-control" />
          <div className="invalid-feedback d-block">
            {this.state.error}
          </div>
        </div>

        <button className="btn btn-primary">Submit</button>
      </form>
    );
  }
}

无效输入 FormNoValidate

如果您想更进一步(更多功能、更多控制、更好的集成):

我编写了一个非常简单的 React 库来处理表单验证并支持 HTML5 属性:https : //github.com/tkrotoff/react-form-with-constraints

这里的例子:https : //github.com/tkrotoff/react-form-with-constraints/blob/master/README.md#examples

使用 React 钩子,我们可以构建自定义钩子以使验证更容易。以你的榜样打击。您可以轻松地通过register从 react hook 表单添加方法:https : //github.com/bluebill1049/react-hook-form

import React from 'react';
import useForm from 'react-hook-form';

function Test() {
  const { register, handleSubmit } = useForm();
  const onSubmit = data => console.log(data);

  return {
    <form className="form-group" onSubmit={handleSubmit(onSubmit)}>
      <label className="col-sm-0 control-label"> Name : &nbsp; </label>
        <input
          type="text"
          ref={register}
          placeholder="Name"
          pattern="[A-Za-z]{3}"
          className="form-control"
        /> 
     </div>
  }
}