我知道如果您从SubmissionError
函数中抛出handleSubmit()
,redux-form
代码将填写相应字段和/或表单本身的错误。< / p>
然而,设置字段/表单错误的API会将handleSumbit()
的实现紧密耦合为redux-form
代码的调用者(包含SubmissionError
异常处理程序)。
我的用例是这样的:
function asyncActionDispatcher(values) {
return (dispatch, getState) => {
// I'm using getState, which is not accessible in handleSubmit()
// But I'd also like to be able to set errors on the form fields and/or the
// form.
};
}
function handleSubmit(values, dispatch) {
dispatch(
asyncActionDispatcher(values)
);
}
我无法在SubmissionError
中抛出asyncActionDispatcher()
,因为它是redux
而不是redux-form
。
redux-form
是否有其他API来设置字段/表单上的错误?
答案 0 :(得分:5)
是的,确实如此。
您可以使用validate
和asyncValidate
道具为表单的值设置验证器函数(分别是同步和异步)。
validate
应该是一个函数,如果验证通过则返回空对象,或者以{ someField: 'some error', otherField: 'other error' }
asyncValidate
应该返回一个Promise
,如果验证通过则会被正常解析,或者如果验证错误没有通过,则返回一个详细说明验证错误的对象(见上文)。
handleSubmit
的实现方式是在调用onSubmit
之前运行同步和异步验证,因此如果您设置了validate
和asyncValidate
,这些错误应该自动出现在您的表单/字段中,无需任何额外的工作。
希望这有帮助!
<强>更新强>
您也可以等到asyncActionDispatcher
完成并继续提交或拒绝SubmissionError
,具体取决于结果。
function asyncActionDispatcher(values) {
return (dispatch, getState) => {
if (success) {
return Promise.resolve('success')
} else {
return Promise.reject('error')
}
}
}
function onSubmit(values, dispatch) {
// dispatch whatever action you need to dispatch
return dispatch(asyncActionDispatcher(values))
.then(() => {
// i guess you need to do your actual submitting here
})
.catch(error => {
return new SubmissionError({ _error: 'whatever you want here' })
})
}
// and in the component
<form onSubmit={ handleSubmit(onSubmit) }> ... </form>
来源:Redux-Form docs,wrapped component props documentation,synchronous validation example,asynchronous validation example
答案 1 :(得分:0)
您的handleSubmit()
被称为:
handleSubmit(values, dispatch, props)
... props
对象的某个属性是stopSubmit()
函数。
这就是你想要使用的,它的API与描述here类似:
stopSubmit(form:String, errors:Object)
// Flips the submitting flag false and populates submitError for each field.
您需要在自己导入该函数并使用该函数时指定唯一的form
字符串标识符,但是如果您使用的版本过去handleSubmit()
(通过props
对象) ,那么你不需要为第一个参数提供参数。
答案 2 :(得分:0)
我从SubmissionError
回调中发出了.catch()
,这是从一个thunk中调用的,所以我认为你应该可以在ReduxSaga中做同样的事情。只需确保return
,以便您不会收到未捕获的异常错误。在我的情况下,thunk返回axios调用,在.handleSubmit()
内部我返回thunk。
答案 3 :(得分:0)
redux-form是否具有另一个API来设置字段/表单的错误?
如果asyncValidate
和建议的其他选项不起作用(例如,由于验证考虑多种形式),此处的另一个选项是直接发送updateSyncErrors
。用法示例如下:
const { updateSyncErrors } = require('redux-form/lib/actions').default;
dispatch(updateSyncErrors('formName', {
fieldName: 'Some Error Message'
}));