reactjs - 如何在我的反应组件中添加验证消息
问题描述
我有这个应用程序可以添加产品并对其进行更新。事实上,可以在没有名称的情况下提交产品表单,并且它会在名称列中创建一个带有空行的新产品。我如何添加验证消息以便它在提交结果之前需要一个“名称”字段,如果您尝试提交没有名称值的表单,则会显示一条消息。
import React from 'react';
const RESET_VALUES = {id: '', category: '', price: '', stocked: false, name: ''};
class ProductForm extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.handleSave = this.handleSave.bind(this);
this.state = {
product: Object.assign({}, RESET_VALUES),
errors: {}
};
}
handleChange(e) {
const target = e.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
this.setState((prevState) => {
prevState.product[name] = value;
return { product: prevState.product };
});
}
handleSave(e) {
this.props.onSave(this.state.product);
this.setState({
product: Object.assign({}, RESET_VALUES),
errors: {}
});
e.preventDefault();
}
render() {
return (
<form>
<h3>Enter a new product</h3>
<p>
<label>
Name
<br />
<input type="text" name="name" onChange={this.handleChange} value={this.state.product.name}/>
</label>
</p>
<p>
<label>
Category
<br />
<input type="text" name="category" onChange={this.handleChange} value={this.state.product.category} />
</label>
</p>
<p>
<label>
Price
<br />
<input type="text" name="price" onChange={this.handleChange} value={this.state.product.price} />
</label>
</p>
<p>
<label>
<input type="checkbox" name="stocked" onChange={this.handleChange} checked={this.state.product.stocked}/>
In stock?
</label>
</p>
<input type="submit" value="Save" onClick={this.handleSave}/>
</form>
);
}
}
export default ProductForm;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
解决方案
默认情况下将错误设置为空。
this.state = {
product: Object.assign({}, RESET_VALUES),
errors: null
};
将您的 handleSave 更新为如下内容:
handleSave(e) {
e.preventDefault();
if (this.state.product.name.trim() === '') {
this.setState({errors: {name: 'Please fill name'}});
return;
}
this.props.onSave(this.state.product);
this.setState({
product: Object.assign({}, RESET_VALUES),
errors: null
});
}
然后在输入字段下的表单渲染方法中显示错误。
<label>
Name
<br />
<input type="text" name="name" onChange={this.handleChange} value={this.state.product.name}/>
{this.state.errors && <p>{this.state.errors.name}</p>}
</label>
推荐阅读
- javascript - Javascript将对象转换为另一个复杂的变体
- python-3.x - 如何根据另一个数据框条件替换数据框列中的值
- java - 在 ConfigurationProperties 发生更改后,使用 Spring @RefreshScope、@Conditional 注释在运行时替换 bean 注入
- javascript - 无状态功能组件方法永远不会从 Redux 存储中获取新数据,但其他方法会这样做
- python - Python中是否有与RStudio的“.rs.askForPassword”等价的东西?
- c# - C# - Try/Catch/Finally 并使用正确的顺序
- angular - 重置 Angular Reactive FormArray 值
- ios - 如何为 collectionviewcell 内的进度条创建 IBOutlet?
- javascript - 用javascript压缩二维数组的重复
- sql - 如何计算 Microsoft SQL Server 中所有 ID 的日期差异