![](/img/trans.png)
[英]Redux Form v6 - onSubmit function being called, but not dispatching an action
[英]Promisifying a redux form onSubmit function
我想使我的SubmitForm用于redux表单onSubmit处理的实现。
与此处的示例相同https://redux-form.com/7.1.2/examples/submitvalidation/
submitForm = () => {
return this.props.submituserForm()
.then(() => { console.log('test') })
.catch(() => { console.log('error') })
}
-----------------------------------
const mapDispatchToProps = (dispatch) => {
// i want to promisify submituserForm to behave like the sleep
// function below
return {
submituserForm: () => dispatch(submit())
}
};
////////////////////////////////////////////////////
// this part is working fine
const submit = () => {
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
// simulate server latency
return sleep(5000)
.then(() => { console.log('test') };
}
我相信您在想这是错误的方式。 redux-form
已经具有一种在提交表单时处理承诺 (“承诺”) 的机制 。 从文档:
如果您的onSubmit函数返回一个Promise,则Submitting属性将设置为true,直到Promise被解决或拒绝为止。 如果它被包含格式为{field1:'error',field2:'error'}的错误的redux形式的SubmissionError拒绝,则提交错误将被添加到每个字段(错误道具),就像异步验证错误是。 如果存在不是特定于任何字段但适用于整个表单的错误,则可以传递该错误,就好像它是称为_error的字段的错误一样,并将其作为错误属性给出。
这将起作用:
// submit.js
import { SubmissionError } from "redux-form";
export const submit = (values, dispatch, props) => {
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
// simulate server latency
return sleep(5000)
.then(() => { console.log('test') })
.catch(() => {
console.error('error');
throw new SubmissionError({ _error: 'There was an error submitting.' });
});
}
// MyForm.js
import React from "react";
import { reduxForm, ... } from "redux-form";
import { submit } from "submit";
class MyForm extends React.Component {
...
render() {
const { error, handleSubmit } = this.props;
return (
<form onSubmit={handleSubmit}>
...
{error && <strong>{error}</strong>}
<button type="submit" value="Submit">Submit</button>
</form>
)
}
};
export default reduxForm({
form: "MyForm",
onSubmit: submit
})(MyForm);
请参阅此示例 ,以获取有关如何处理提交表单时的承诺的更详细说明。
您需要让submit()
返回一个thunk才能使dispatch(submit())
在使用react-redux
时返回Promise
:
const submit = () => {
return (dispatch, getState) => {
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
// simulate server latency
return sleep(5000)
.then(() => { console.log('test') };
}
}
目前,它返回的是Promise
,这不是redux-thunk
需要的。 相反,您需要返回一个返回Promise的函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.