Вручную установите поле redux-form и / или ошибки формы
Я знаю, что если вы бросите SubmissionError из своей функции handleSubmit(), код redux-form заполнит ошибки соответствующих полей и/или самой формы.
Тем не менее, этот 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 для установки ошибок в полях / формах?
3 ответов:
Да, это так.
Вы можете использовать
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, завернутый компонент реквизит документация, пример синхронной проверки, пример асинхронной проверки
Ваш
handleSubmit()называется так:handleSubmit(values, dispatch, props)...где одним из свойств этого объекта
propsявляется функцияstopSubmit().Это то, что вы хотите использовать, где это API похоже на то, как описано здесь:
stopSubmit(form:String, errors:Object) // Flips the submitting flag false and populates submitError for each field.Вам нужно будет указать уникальный строковый идентификатор
formпри импорте этой функции самостоятельно и ее использовании, но если вы используете версию past для вашегоhandleSubmit()(через объектprops), то вам не нужно предоставлять аргумент для первого параметр.
Я бросаю
SubmissionErrorиз.catch()обратного вызова axios, который вызывается изнутри thunk, поэтому я думаю, что вы должны быть в состоянии сделать то же самое из ReduxSaga. Просто убедитесь, чтоreturn, чтобы вы не получили необнаруженную ошибку исключения. В моем случае thunk возвращает вызов axios, а внутри.handleSubmit()я возвращаю thunk.
Comments