使用 Material UI 的 TextField 组件进行 React 验证

React validation using Material UI's TextField components

我已经研究了一个小时了,网上似乎没有太多这方面的例子。我正在尝试验证输入字段,以便填写所有字段,否则会出现错误。字数无所谓,只需要填写输入即可。

这是我的状态对象

constructor(props) {
    super(props);
    this.state = {
      firstName: '',
      lastName: '',
      ...,
    
    };
  }

这里是 material ui 文本字段

<TextField
                className={classes.formInput}
                name="firstName"
                onChange={e => this.handleChange(e.target.value)}
                required
                id=""
                type="text"
                InputLabelProps={{
                  shrink: true,
                }}
                error={!firstName}
                helperText="Name is required"
                label="First Name"
                variant="standard" />
              <TextField
                className={classes.formInput}
                name="lastName"
                onChange={e => this.handleChange(e.target.value)}
                required
                id=""
                type="text"
                InputLabelProps={{
                  shrink: true,
                }}
                label="Last Name"
                variant="standard" />

这里是 onchange 处理程序

   handleChange = (e) => {
     this.setState({
       [e.target.name]: e.target.value
     });
   }

您很可能只想在用户尝试提交表单后才添加此验证。然后,您应该为 formError 创建一个新状态并将其添加到您的提交函数条件中,该条件将检查您的输入是否为空然后将 formError 的状态设置为 true。之后,您的输入错误状态表达式将如下所示:

error={formError && firstName.length === 0}

当您的输入仅在尝试提交包含空输入的表单时才以红色突出显示时,您将获得良好的用户体验。

当用户提交表单时,由于您要做的只是验证 某物 已填充到 firstName 和 lastName 字段中,您可以使用以下任一方法检查:

this.state.field !== '' //returns true if it's filled in

this.state.field.length > 0 //returns true if it's filled in

在您创建的任何 'handleSubmit' 函数中,您都可以调用单独的函数来验证所有字段。该验证函数可能如下所示:

// returns 'true' if fields filled out, and 'false' if not 
validateForm = () => {
  if (this.state.firstName === '' || this.state.lastName === '') {
    //set error message: 'Please fill out all fields')
    return false;
  } else {
    return true;
  }
}