我最近开始使用React,我遇到了输入验证的问题。例如,它只是通过指令在另一个框架中实现为Angular.js。
经过一番研究后我找到了
但我找不到每个人都试图创造自己的最佳实践,因此你需要自己写一些东西。
表单验证的最佳解决方案是什么? React架构/框架(Flux / Redux)是否提供任何解决方案?
谢谢,
答案 0 :(得分:3)
我最近在React中使用了一些表格,我的体验非常相似。我认为这归结为React是非常新的,并且表单验证通常是一个难以解决的问题。这导致了形式验证的狂野西部,其中没有设定标准,并且许多新的库试图解决问题(每个都按照自己的方式做出并做出许多假设)。
我最终使用了formy-react(https://github.com/christianalfoni/formsy-react),这是相当简单的,但做了一个大假设 - 我们要验证输入onChange
。我希望我的输入呈现错误onBlur
,这导致我编写一些辅助函数来创建该行为。
我还没有过多地挖掘Redux,但在这个领域(https://www.npmjs.com/package/redux-form)似乎有一些很好的选择,可能适合你的需求。
如果您想查看我的Formsy表单验证器/辅助方法的示例,请告诉我。
希望这有所帮助,或者至少提供了一些团结一致,即React世界中的形式验证,目前尚不清楚,缺乏标准。
答案 1 :(得分:2)
我正在使用轻质称重解决方案,它非常可定制。
输入已在onChange
上验证,但可以在任何位置更改。我们可以为textarea,checkbox,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} />
);
}
});
我们要在其中呈现表单的组件。我们可以添加尽可能多的验证规则
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="example@example.com"/>
</div>
);
}
});
这非常简单且可自定义,对于小型项目来说非常好。但是如果我们一个项目大而且有很多不同的形式,每次用处理程序编写App组件都不是最佳选择