Tôi đang sử dụng giải pháp cân nhẹ và nó có thể tùy chỉnh được.
Đầu vào được xác thực trên onChange
nhưng có thể được thay đổi trên bất kỳ. Chúng tôi có thể tạo thành phần tương tự cho văn bản, hộp kiểm, radio
var Input = React.createClass({
getInitialState: function(){
// we don't want to validate the input until the user starts typing
return {
validationStarted: false
};
},
prepareToValidate: function(){},
_debounce: function(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
},
componentWillMount: function(){
var startValidation = function(){
this.setState({
validationStarted: true
})
}.bind(this);
// if non-blank value: validate now
if (this.props.value) {
startValidation();
}
// wait until they start typing, and then stop
else {
this.prepareToValidate = _self._debounce(startValidation, 1000);
}
},
handleChange: function(e){
if (!this.state.validationStarted) {
this.prepareToValidate();
}
this.props.onChange && this.props.onChange(e);
},
render: function(){
var className = "";
if (this.state.validationStarted) {
className = (this.props.valid ? 'Valid' : 'Invalid');
}
return (
<input
{...this.props}
className={className}
onChange={this.handleChange} />
);
}
});
Thành phần của chúng tôi nơi chúng tôi sẽ hiển thị biểu mẫu. Chúng tôi có thể thêm nhiều quy tắc xác thực như muốn
var App = React.createClass({
getInitialState: function(){
return {email: ""};
},
handleChange: function(e){
this.setState({
email: e.target.value
})
},
validate: function(state){
return {
email: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/.test(state.email)
}
},
render: function(){
var valid = this.validate(this.state);
return (
<div>
<Input valid={valid.email}
value={this.state.email}
onChange={this.handleChange}
placeholder="[email protected]"/>
</div>
);
}
});
Điều này khá đơn giản và có thể tùy chỉnh và cho các dự án nhỏ hoạt động rất tốt. Nhưng nếu chúng tôi là một dự án lớn và có nhiều hình thức khác nhau, để viết mỗi lần thành phần ứng dụng với trình xử lý không phải là lựa chọn tốt nhất
Nguồn
2015-10-01 11:51:36