如何在react +材料中检查表格是否有效?

时间:2018-09-06 09:23:00

标签: reactjs redux material-design material-ui

有什么方法可以知道react + material ui中的形式是否有效。我在演示中使用了react material。我在表单中有三个字段都是必需的。我想检查submit按钮表单是否有效

这是我的代码 https://codesandbox.io/s/w7w68vpjj7

我不想使用任何插件

submitButtonHandler = () => {
    console.log("error");
    console.log(this.state.form);
  };

  render() {
    const { classes } = this.props,
      { form } = this.state;
    return (
      <div className={classes.searchUser__block}>
        <SearchForm
          handleInput={this.handleInputFieldChange}
          submitClick={this.submitButtonHandler}
          form={form}
        />
      </div>
    );
  }

3 个答案:

答案 0 :(得分:1)

如果您不想使用任何库,则必须手动进行验证。 Material-ui没有根据其文档内置任何验证。但是它确实为您提供了一些工具,例如将errorMessage传递到文本字段。您只需要玩

示例:

class PhoneField extends Component
  constructor(props) {
    super(props)
    this.state = { errorText: '', value: props.value }
  }
  onChange(event) {
    if (event.target.value.match(phoneRegex)) {
      this.setState({ errorText: '' })
    } else {
      this.setState({ errorText: 'Invalid format: ###-###-####' })
    }
  }
  render() {
    return (
      <TextField hintText="Phone"
        floatingLabelText="Phone"
        name="phone"
        errorText= {this.state.errorText}
        onChange={this.onChange.bind(this)}
      />
    )
  }
}

我周围放置的一个过时的示例

答案 1 :(得分:1)

表单验证可能非常复杂,因此,我很确定您最终将使用库。现在,要回答您的问题,我们需要考虑表单提交流程。这是一个简单的示例:

  1. “预提交”
    • isSubmitting设置为true
    • 继续进行“验证”
  2. “验证”

    • 使用validationRules运行所有字段级验证
    • 是否有任何错误?
      1. 是:中止提交。设置错误,将isSubmitting设置为false
      2. 否:继续“提交”
  3. “提交”

    • 继续运行您的提交处理程序(即onSubmithandleSubmit
    • isSubmitting设置为false

一些最小的实现是这样的:

// ...imports
import validateForm from "../helpers/validateForm";
import styles from "./styles";
import validationRules from "./validationRules";

const propTypes = {
  onSubmit: PropTypes.func.isRequired,
  onSubmitError: PropTypes.func.isRequired,
  initialValues: PropTypes.shape({
    searchValue: PropTypes.string,
    circle: PropTypes.string,
    searchCriteria: PropTypes.string
  })
};

const defaultProps = {
  initialValues: {}
};

class SearchForm extends Component {
  constructor(props) {
    super(props);
    this.validateForm = validateForm.bind(this);
    this.state = {
      isSubmitting: false,
      values: {
        searchValue: props.initialValues.searchValue || "",
        circle: props.initialValues.circle || "",
        searchCriteria: props.initialValues.searchCriteria || ""
      },
      ...this.initialErrorState
    };
  }

  get hasErrors() {
    return !!(
      this.state.searchValueError ||
      this.state.circleError ||
      this.state.searchCriteriaError
    );
  }

  get initialErrorState() {
    return {
      searchValueError: null,
      circleError: null,
      searchCriteriaError: null
    };
  }

  handleBeforeSubmit = () => {
    this.validate(this.onValidationSuccess);
  };

  validate = (onSuccess = () => {}) => {
    this.clearErrors();
    this.validateForm(validationRules)
      .then(onSuccess)
      .catch(this.onValidationError);
  };

  onValidationSuccess = () => {
    this.setState({ isSubmitting: true });
    this.props
      .onSubmit(this.state.values)
      .catch(this.props.onSubmitError)
      .finally(() => this.setState({ isSubmitting: false }));
  };

  onValidationError = errors => {
    this.setState({ ...errors });
  };

  clearErrors = () => {
    this.setState({ ...this.initialErrorState });
  };

  updateFormValue = fieldName => event => {
    this.setState(
      {
        values: { ...this.state.values, [fieldName]: event.target.value }
      },
      () => this.validate()
    );
  };

  render() {
    // ...
  }
}

SearchForm.propTypes = propTypes;
SearchForm.defaultProps = defaultProps;

export default withStyles(styles)(SearchForm);

如您所见,如果提交流将变大(例如,触摸输入,传递错误等),则组件内部的复杂性也将显着增加。这就是为什么最好使用维护良好的选择库。 Formik是我目前的个人偏好。

随时查看更新后的codesandbox。希望对您有所帮助。

答案 2 :(得分:0)

嗨,乔伊,如果必填字段为空,我已经进行了理想的表单验证。

这是更新的代码和框:https://codesandbox.io/s/50kpk7ovz4