javascript - ReactJS - 输入验证不验证
问题描述
我正在尝试对我的表单进行验证。
class Car extends Component {
constructor() {
super();
this.state = {
name: '',
errors: {}
}
this.handleNameChange = this.handleNameChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
componentWillReceiveProps(nextProps) {
if(nextProps.errors) {
this.setState({
errors: nextProps.errors
});
}
}
handleNameChange(e) {
this.setState({
[e.target.name]: e.target.value
})
}
handleSubmit(e) {
e.preventDefault();
const car = {
name: this.state.name,
...
}
console.log(car);
axios.post('/api/cars/create', car)
.then(response => {
console.log('response.data: ', response.data);
}).catch(function(err) {
console.log(err)
});
}
render() {
const { errors } = this.state;
console.log('errors name: ', errors.name);
...
return (
<div className="container" style={{ marginTop: '50px'}}>
<h2 style={{marginBottom: '40px'}}>Cars</h2>
<form className="" onSubmit={ this.handleSubmit }>
<div className="row">
<div className="col-sm-3">
<div className="form-group">
<label>Car Name</label>
<input
type="text"
placeholder="Name"
className={classnames('form-control form-control-sm', {
'is-invalid': errors.name
})}
name="name"
onChange={ this.handleNameChange }
value={ this.state.name }
/>
{errors.name && (<div className="invalid-feedback">{errors.name}</div>)}
</div>
</div>
...
);
}
}
Car = {
//registerUser: PropTypes.func.isRequired,
auth: PropTypes.object.isRequired,
errors: PropTypes.object.isRequired
};
const mapStateToProps = state => ({
auth: state.auth,
errors: state.errors
});
export default connect(mapStateToProps,{ registerUser })(withRouter(Car))
然后,在car.js中,我有以下内容:
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const passport = require('passport');
const validateCarInput = require('../validation/car');
const Car = require('../models/Car');
router.post('/create', function(req, res) {
console.log('in /create');
console.log('req.body.name: '+req.body.name);
const { errors, isValid } = validateCarInput(req.body);
if(!isValid) {
console.log('hello from validation');
return res.status(400).json(errors);
}
...
如果我发送的表单包含不正确的字段(空name
),我将在此处收到来自控制台的消息hello from validation
。这里很好。
这是validations/car.js
文件:
const Validator = require('validator');
const isEmpty = require('./is-empty');
module.exports = function validateCarInput(data) {
let errors = {};
console.log('x data.name: ', data.name);
data.name = !isEmpty(data.name) ? data.name : '';
if(Validator.isEmpty(data.name)) {
errors.name = 'Name field is required';
console.log('errors.name: ', errors.name);
}
return {
errors,
isValid: isEmpty(errors)
}
}
有什么问题 - 当我发送带有空name
字段的表单时 - 这意味着该字段无效 - 它不能为空 - NodeJS 能够识别这一点,但是对于 ReactJS 组件来说,并没有传递此信息。
在组件中,这行代码console.log('errors name: ', errors.name);
总是产生undefined for errors.name
- 然后,这个信息永远不会显示在网站上:
{errors.name && (<div className="invalid-feedback">{errors.name}</div>)}
为什么 ReactJS 看不到来自 NodeJS 的消息并且errors.name
总是如此undefined
?
解决方案
我认为你应该提出这个请求,.catch((error) => this.setState({error: {names: error}}))
但我认为名称应该是这样的,.catch(function(error) => this.setState({errors: {[name]: error}}))
但你必须知道有错误的字段的名称是什么
推荐阅读
- ios - iOS中的Adyen hpp页面集成总是给商家签名无效错误
- javascript - 克隆类型并使用它的键
- bootloader - STM32F4:从自定义引导加载程序跳转到用户应用程序触发 HardFault 异常
- javascript - 如何使用java脚本动态更改对象的键并将多个类似对象的数组合并为单个数组?
- azure - Azure 函数应用程序-Active Directory 调用(“SetPassword”)-拒绝访问
- java - 如何使用 bitcoinj 库从现有钱包发送交易?
- javascript - PassportJs req.authenticated 总是返回 false
- format - 在 Format 中有 $.15f - 这是什么意思?
- android - SSL Pinning 在 Android 中无法使用 Certificate Pinner(Hash Key Pinning)
- power-automate - Power Automate - 找不到触发器或操作