我有一個組件根據輸入是否有效使用className="error"
或classname=""
進行渲染。這種方式在CSS中我可以簡單地做.error { background: red; }
。輸入的有效性由isValidNumber(..)
函數確定。但是,現在我遇到的問題是驗證是太瞬時。如果輸入無效,它幾乎立即呈現「錯誤」類名,這是一個令人討厭的用戶體驗問題。我希望有一些延遲,讓班級不會立即「出錯」,比如0.5秒就好。ReactJS中的輸入驗證setTimeout
Demo of component。輸入在「23億」,「1萬億」或「203239123」等事物上有效,但不是「2羊」或「山」。 Github Repo
這是我的組件到目前爲止。您可以看到,我試圖使用setTimeout
和setState({ isValid: isValid })
作爲函數,只要isValid
爲false。
export default class NumberInput extends React.Component {
constructor(props) {
super(props);
this.state = {
value: "",
isValid: false
};
}
setIsValid(isValid) {
this.setState({ isValid: isValid })
}
handleChange(event) {
var value = event.target.value
this.setState({ value: event.target.value })
var isValid = isValidNumber(value)
if (isValid === false) {
setTimeout(this.setIsValid(isValid), 2000);
} else {
this.setIsValid(isValid)
}
}
getClassName() {
var className = ''
var errorClass = ''
// Generate error classes based on input validity.
if (this.state.isValid) {
errorClass = ''
} else {
errorClass = 'error'
}
className = 'number-input ' + errorClass
return className
}
render() {
return (
<div>
<input type="text" className={this.getClassName()} value={this.state.value} onChange={this.handleChange.bind(this)} placeholder="Enter a number"/>
<RawNumber isValid={this.state.isValid} value={this.state.value} />
</div>
)
}
}
'setTimeout(this.setIsValid.call(this,isValid),2000);'是錯的。你的意思是使用'.bind'而不是'.call'? –
@FelixKling是的,我的壞。謝謝! –