有什么方法可以知道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>
);
}
答案 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)
表单验证可能非常复杂,因此,我很确定您最终将使用库。现在,要回答您的问题,我们需要考虑表单提交流程。这是一个简单的示例:
isSubmitting
设置为true
“验证”
validationRules
运行所有字段级验证isSubmitting
设置为false
“提交”
onSubmit
或handleSubmit
)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