handleSubmit()
関数からSubmissionError
をスローすると、_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)
);
}
_
_redux-form
_ではなくSubmissionError
によって呼び出されるため、asyncActionDispatcher()
にredux
をスローできません。
_redux-form
_には、フィールド/フォームにエラーを設定するための別のAPIがありますか?
はい、そうです。
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 、 ラップされたコンポーネントの小道具のドキュメント 、 同期検証の例 、 非同期検証の例
Redux-formにはフィールド/フォームにエラーを設定するための別のAPIがありますか?
asyncValidate
および提案された他のオプションが機能しない場合の別のオプション(たとえば、検証で複数のフォームが考慮されるため)は、updateSyncErrors
を直接ディスパッチすることです。以下の使用例:
const { updateSyncErrors } = require('redux-form/lib/actions').default;
dispatch(updateSyncErrors('formName', {
fieldName: 'Some Error Message'
}));
handleSubmit()
は次のように呼び出されます。
_handleSubmit(values, dispatch, props)
_
...そのprops
オブジェクトのプロパティの1つはstopSubmit()
関数です。
それがあなたが使いたいものであり、APIは説明されているものと似ています ここ :
_stopSubmit(form:String, errors:Object)
// Flips the submitting flag false and populates submitError for each field.
_
その関数を自分でインポートして使用する場合は、一意のform
文字列識別子を指定する必要がありますが、handleSubmit()
に過去のバージョンを使用する場合(props
オブジェクトを介して) )、最初のパラメーターの引数を指定する必要はありません。
サンク内から呼び出されるaxiosの.catch()
コールバックからSubmissionError
をスローしているので、ReduxSaga内からも同じことができるはずです。キャッチされない例外エラーが発生しないように、必ずreturn
にしてください。私の場合、サンクはaxios呼び出しを返し、.handleSubmit()
の内部でサンクを返します。