我目前正在尝试将验证添加到使用material-ui组件构建的表单。我有它工作,但问题是我目前正在这样做的方式验证功能当前正在调用输入中的每个状态更改(即每个键入的字母)。但是,我只希望在输入停止后进行验证。
鉴于我目前的代码:
class Form extends React.Component {
state = {open: false, email: '', password: '', email_error_text: null, password_error_text: null, disabled: true};
handleTouchTap() {
this.setState({
open: true,
});
}
isDisabled() {
let emailIsValid = false;
let passwordIsValid = false;
if (this.state.email === "") {
this.setState({
email_error_text: null
});
} else {
if (validateEmail(this.state.email)) {
emailIsValid = true
this.setState({
email_error_text: null
});
} else {
this.setState({
email_error_text: "Sorry, this is not a valid email"
});
}
}
if (this.state.password === "" || !this.state.password) {
this.setState({
password_error_text: null
});
} else {
if (this.state.password.length >= 6) {
passwordIsValid = true;
this.setState({
password_error_text: null
});
} else {
this.setState({
password_error_text: "Your password must be at least 6 characters"
});
}
}
if (emailIsValid && passwordIsValid) {
this.setState({
disabled: false
});
}
}
changeValue(e, type) {
const value = e.target.value;
const nextState = {};
nextState[type] = value;
this.setState(nextState, () => {
this.isDisabled()
});
}
login() {
createUser(this.state.email, this.state.password);
this.setState({
open: false
});
}
render() {
let {open, email, password, email_error_text, password_error_text, disabled} = this.state;
const standardActions = (
<FlatButton
containerElement={<Link to="/portal" />}
disabled={this.state.disabled}
label="Submit"
onClick={this.login.bind(this)}
/>
);
return (
<div style={styles.container}>
<Dialog
open={this.state.open}
title="Enter Your Details to Login"
actions={standardActions}
>
<span className="hint--right hint--bounce" data-hint="Enter in your email address">
<TextField
hintText="Email"
floatingLabelText="Email"
type="email"
errorText={this.state.email_error_text}
onChange={e => this.changeValue(e, 'email')}
/>
</span>
<br />
<span className="hint--right hint--bounce" data-hint="Enter your password">
<TextField
hintText="Password"
floatingLabelText="Password"
type="password"
errorText={this.state.password_error_text}
onChange={e => this.changeValue(e, 'password')}
/>
</span>
</Dialog>
<h1>VPT</h1>
<h2>Project DALI</h2>
<RaisedButton
label="Login"
primary={true}
onTouchTap={this.handleTouchTap.bind(this)}
/>
</div>
);
}
}
export default Form;
有没有一种方法可以实现我想要的功能,而无需对代码进行重大更改,还是需要完全重构?
非常感谢任何帮助
感谢您的时间
答案 0 :(得分:8)
检查是否必须在一定延迟后进行?我认为在大多数情况下足够的解决方案是将代码分解一点。不要在isDisabled()
中触发您的changedValue()
功能。而是让它在onBlur
事件上运行。
试试这个:
<TextField
hintText="Password"
floatingLabelText="Password"
type="password"
errorText={this.state.password_error_text}
onChange={e => this.changeValue(e, 'password')}
onBlur={this.isDisabled}
/>
然后你的功能变为:
changeValue(e, type) {
const value = e.target.value;
const nextState = {};
nextState[type] = value;
this.setState(nextState);
}
答案 1 :(得分:3)
我创建的这个library负责处理与验证字段相关的所有内容,并且它还支持material-ui组件......
要验证您的字段,您只需要将字段组件包装好即可完成...省去了手动管理状态的大量工作。
<Validation group="myGroup1"
validators={[
{
validator: (val) => !validator.isEmpty(val),
errorMessage: "Cannot be left empty"
}, ...
}]}>
<TextField value={this.state.value}
className={styles.inputStyles}
style={{width: "100%"}}
onChange={
(evt)=>{
console.log("you have typed: ", evt.target.value);
}
}/>
答案 2 :(得分:2)
最简单的是调用form.reportValidity()
。可以通过调用form
获得event.currentTarget.form
。
答案 3 :(得分:1)
我刚刚发布了npm package来验证表单。可以在我的github profile
上找到工作示例答案 4 :(得分:1)
当前的Material-UI版本未使用errorText
道具,但是仍然可以使用一种方法来显示错误并将验证应用于Material-UI中的TextField。
我们使用error
(布尔值)属性表示是否存在错误。要进一步显示错误文本,请在Material-UI中使用TextField的helperText
属性,只需向其提供要显示的错误文本即可。
这样做:
<TextField
value={this.state.text}
onChange={event => this.setState({ text: event.target.value })}
error={text === ""}
helperText={text === "" ? 'Empty!' : ' '}
/>
答案 5 :(得分:0)
您可以使用onblur文本字段事件。当输入失去焦点时触发它。