我想在React中構建一個密碼確認表單,但是我無法獲得輸入驗證以雙向工作。重現:比較表單組件值
- 輸入密碼。
- 輸入一個匹配的確認密碼。
- 編輯確認密碼,以便它不再匹配。
- 編輯密碼字段以匹配確認密碼。
最後一步不起作用,我認爲我在handlePasswordInput
中設置密碼狀態的方式有問題。在調用此方法時,isConfirmedPassword
方法中的this.state.password
方法不保留最新密碼。
我創建了一個二進制位代碼:https://jsbin.com/sufupedayi/edit?js,output
任何陣營的專家誰可以點我在正確的方向?
SignIn = React.createClass({
getInitialState() {
return {
password: null,
confirmPassword: null
}
},
handlePasswordInput(value) {
if (!_.isEmpty(this.state.confirmPassword)) {
this.refs.confirmPassword.validate(value);
}
this.setState({
password: value
})
},
handleConfirmPasswordInput(value) {
this.setState({
confirmPassword: value
})
},
isConfirmedPassword(value) {
return (value === this.state.password)
},
render() {
return (
<form autoComplete="off">
<Input
name="password"
placeholder="Password"
errorMessage="Password is required"
onChange={this.handlePasswordInput}
/>
<Input
ref="confirmPassword"
name="confirmPassword"
placeholder="Confirm password"
errorMessage="Passwords do not match"
onChange={this.handleConfirmPasswordInput}
validate={this.isConfirmedPassword}
/>
<button type="submit">Submit</button>
</form>
)
}
});
Input = React.createClass({
getInitialState() {
return {
valid: false,
value: null,
errorMessage: this.props.errorMessage,
errorVisible: false
}
},
handleChange(event) {
this.setState({
value: event.target.value
})
if (this.props.validate) {
this.validate(event.target.value);
}
if (this.props.onChange) {
this.props.onChange(event.target.value);
}
},
validate(value) {
if (this.props.validate && this.props.validate(value)) {
this.setState({
valid: true,
errorVisible: false
});
} else {
this.setState({
valid: false,
errorVisible: true
});
}
},
render() {
return (
<div>
<input
name={this.props.name}
placeholder={this.props.placeholder}
onChange={this.handleChange}
/>
{!this.state.valid && <InputError errorMessage={this.state.errorMessage} visible={this.state.errorVisible} />}
</div>
)
}
});
InputError = React.createClass({
render() {
var divStyle = {
display: this.props.visible ? 'inline-block': 'none'
}
return (
<div style={divStyle}>{this.props.errorMessage}</div>
)
}
})
React.render(<SignIn />, document.body);
雖然這確實起作用,但它不覺得是一個合適的解決方案。 @多米尼克 - 托比亞斯的解決方案感覺更好。他的解決方案指出了我的正確方向。 – Stuiterbal