我不确定我的确切问题是什么,因为我对REDx和所涉及的各种插件做出反应是相当新的 .
我的设置使用以下包:
"axios": "^0.17.0",
"react": "^16.1.1",
"react-dom": "^16.1.1",
"react-redux": "^5.0.6",
"react-router-dom": "^4.2.2",
"react-scripts": "1.0.17",
"redux": "^3.7.2",
"redux-form": "^7.1.2",
"redux-promise": "^0.5.3"
我有一个组件使用表单将数据发布到服务器 endpoints .
根据结果,我想显示表单级别验证,例如: username does not exist
我想显示表单级别错误 . 或者,如果我得到 404
响应,我也希望能够处理这个问题 .
我目前使用文件底部的标准方法将我的组件链接到 redux-form
库 . 我的验证函数在表单提交之前按预期运行 .
我的表单有一个 onSubmit
属性,可以解析为返回的promise . 此承诺是从发出服务器请求的操作创建者中提取的 .
我已经阅读了redux-form docs,看起来我正在寻找SubmissionError .
当我在我的 onSubmit
函数中抛出此错误时,我得到了预期的行为,然后我的动作创建者没有运行 .
onSubmit(values) {
throw new SubmissionError({_error: 'test' })
return this.props.loginUser(values));
}
如果我从返回的promise中链接一个 .then()
并在此处抛出 SubmissionError
,我会收到另一个错误 .
onSubmit(values) {
return this.props.loginUser(values).then(() => { throw new SubmissionError({_error: 'test' })});
}
我已准备好许多答案,但没有一个适合我的情况 . 有些是相似的,我已经能够实现这一点,因为我仍然无法按预期触发依赖于服务器响应的表单级别错误 .
LoginForm:
import React, { Component } from 'react';
import { Field, reduxForm, SubmissionError } from 'redux-form';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux';
import { loginUser } from '../../../actions';
import InputField from '../Fields/InputField.js';
import { VIEWS } from '../../../routes';
class Login extends Component {
constructor(props) {
super(props);
this.onSubmit = this.onSubmit.bind(this);
}
onSubmit(values) {
return this.props.loginUser(values);
}
render() {
const { handleSubmit } = this.props;
return (
<div className="auth-form">
<div className="auth-block">
<div className="auth-content">
<h1>Specify with Certainty</h1>
<h1>{this.props.error}</h1>
<form onSubmit={handleSubmit(this.onSubmit)}>
<Field
name="email"
placeholder="Email"
type="email"
component={InputField}
/>
<Field
name="password"
placeholder="Password"
type="password"
component={InputField}
/>
<button className="action submit" type="submit">Sign in</button>
<div className="checkbox">
<label htmlFor="remember">
<Field
name="remember"
type="checkbox"
component={InputField}
/>
<span>Remember me</span>
</label>
</div>
</form>
<div className="register-promt">
<p>Don't have an account?</p>
<Link to={VIEWS.REGISTER}>Register Now »</Link>
</div>
</div>
</div>
</div>
);
}
}
function validate(values) {
const errors = {};
// Need to validate email here
if(!values.email) {
errors.email = "Enter an email";
}
if(!values.password) {
errors.password = "Enter a password";
}
return errors;
}
const formData = {
validate,
form: 'LoginForm'
};
const connected = connect(null, { loginUser })(Login);
export default reduxForm(formData)(connected);
动作创作者
export function loginUser(values) {
const request = axios({
method: 'post',
crossdomain: true,
url: API.LOGIN,
data: values
}).catch((error) => {
console.log('hello world');
throw new SubmissionError({_error: 'testing'});
});
return {
type: LOGIN_USER,
payload: request
};
}
我想我在这里缺少一些小东西,但非常重要 .
如何使用redux-form库以预期的方式基于服务器响应将错误传递给我的表单组件?
任何帮助表示赞赏 .