Webサービスからいくつかの情報をフェッチする非同期サンクがあります。3種類のアクションをディスパッチできます。
FETCH_REQUESTED
FETCH_SUCCEEDED
FETCH_FAILED
最後に、それが成功した場合。実際の応答またはエラーオブジェクトを返します。
操作が失敗したかどうかを検出するコンポーネントがあります。できれば、FETCH_FAILED
アクションをサブスクライブし、エラーのタイプ(404/401およびその他のステータスコード)に基づいてエラーメッセージを表示します。
export const fetchData = () => {
return async (dispatch, getState) => {
const appState = getState();
const { uid } = appState.appReducer;
await dispatch(fetchRequested());
try {
const response = await LookupApiFactory().fetch({ uid });
dispatch(fetchSucceeded(response));
return response;
} catch (error) {
dispatch(fetchFailed());
return error;
}
}
}
私はreduxと反応にまったく慣れていないので、正しい方向に向かっているかどうかは少しわかりません。助けていただければ幸いです。
適切なreduxコールバックとストレージメカニズムを実装するには、すべてのデータを保持するストアが必要です。
const store = createStore(todos, ['Use Redux'])
次に、データをディスパッチして保存します。
store.dispatch({
type: 'FETCH_FAILED',
text: reposnse.status //Here you should give the failed response from api
});
次に、サブスクライブ関数を使用して、任意のコンポーネントのストアから値を取得できます。アクションがディスパッチされるたびに呼び出され、状態ツリーの一部が変更された可能性があります。
store.subscribe(()=>{
store.getState().some.deep.property
})
これはReduxの単純な実装です。アプリがより複雑になるにつれて、リデューシング関数を個別の関数に分割し、それぞれがcombineReducers
を使用して状態の独立した部分を管理するようにします。あなたは redux.jsサイト からより多くの情報を得ることができます
最も一般的なアプローチは、react-redux
ライブラリのconnect
関数を使用することです。これは、状態の変化をサブスクライブするHoCです。このライブラリを見てください。さらに、アクションクリエーターをディスパッチにバインドすることができます。これにより、コンポーネントからアクションをディスパッチすることができます。
次のように使用できます。
import React from 'react';
import { connect } from 'react-redux';
const MyComponent = ({ data, error }) => (
<div>
{error && (
<span>Error occured: {error}</span>
)}
{!error && (
<pre>{JSON.stringify(data, null, 2)}</pre>
)}
</div>
);
const mapStateToProps = (state) => ({
data: state.appReducer.data,
error: state.appReducer.error
});
export default connect(mapStateToProps)(MyComponent);
上に示したように、jsx内で条件付きレンダリングを使用するか、次のようにガード句を使用できます。
const MyComponent = ({ data, error }) => {
if (error) {
return (
<span>Error occured: {error}</span>
);
}
return (
<pre>
{JSON.stringify(data, null, 2)}
</pre>
);
}
レデューサーを想定して、
FETCH_FAILED
アクションの場合、何らかの障害があることを示す意味のあるフラグを設定できます。そのフラグに基づいて、エラーメッセージを表示したり、他のアクションを実行したりできます。
const testReducers =(state,actione)=>{
case 'FETCH_FAILED' : {
return {
...state,{ error_in_response : true }
}
};
default : return state;
}
コンテナでは、そのフラグを取得してコンポーネントに渡すことができます。
combineReducers
がレデューサーの組み合わせに使用されると仮定します。
const mapStateToProps=(state)=>{
return {
error_in_response : state.testReducers.error_in_response
}
}
connect(mapStateToProps)(yourComponent)
コンポーネントでは、これにはthis.props.error_in_response
を使用してアクセスできます