2017-09-18 7 views
1

私はredux-sagaの使用法を使用してプロジェクトを進めています。私はGoogleの力で2日間近く質問に答えを見つけようとしましたが、助けにはなりませんでした。Redux saga - データがreduxストアに既に存在する場合、API requstsをスキップするポイント

各FETCH_REQUESTアクションで、sagaによってトリガーされる関数があります。

export function* fetchData(action) { 
    try { 
    const usersList = (yield select()).usersList; 

    // makes API call only if there is no users found in the current state 
    if(!usersList) { 
     const data = yield call(Api.fetchUser) 
    } 

    yield put({type: "FETCH_SUCCEEDED", usersList}) 
    } catch (error) { 
    yield put({type: "FETCH_FAILED", error}) 
    } 
} 

成功すると、FETCH_SUCCEEDEDアクションがトリガーされ、受信したデータを状態に保存します。しかし、APIコールを作るかどうかという意思決定ポイントは適切な場所にないと私には思われます。 現在のアプローチでは、サガには役に立たず、スキップされたいくつかのアクションが生成されます。他の人が_REQUESTアクションで購読してしまった場合、別の無駄なアクションなどを引き起こします。

したがって、データがAPIまたはReduxStoreからロードする必要があるかどうかを確認する「ベストプラクティス」は何ですか?

答えて

1

あなたのコンポーネントからアクション作成者FETCH_REQUESTを発送することを前提としています。このコンポーネントはおそらくプロパティとしてuserListを受け取ります。したがって、このコンポーネントは、FETCH_REQUESTアクションをディスパッチする必要があるかどうかを判断するのに最適な場所です。このような

何か:

class MyComponent extends React.Component { 
    componentDidMount() { 
    if (!this.props.userList) { 
     this.props.fetchData(); 
    } 
    } 
} 

... 

export default connect(mapStateToProps, mapDispatchToProps)(MyComponent); 

この場合、あなたは自分の佐賀でセレクタと、余分な条件を使用する必要はありません。

+0

お返事ありがとうございます。私はあなたと100%です。若干のアップグレードで、すべての..._ REQUESTアクションをトリガーするloadData()関数を持つHOCがあります。私の考えでは、loadData()は意思決定に最適な場所です。現在、佐賀での意思決定のアプローチが「反パターン」であるときに、私はいくつかの考えを指摘できますか? –

+0

フェッチ要求アクション上の典型的なWebアプリケーションでは、 'loading'フラグをセットしてロードインジケータを表示します。次に、FETCH_SUCCEEDEDまたはFETCH_FAILEDで、 'loading'フラグをfalseに設定します。実際のフェッチなしでFETCH_REQUESTアクションをディスパッチすると、UIにローディングインジケータが常時表示されます。 –

+0

すべてのことがすばやく起こり、UIとローダーアイコンの更新がまったく点滅しないバッチに反応します。また、現在のプロジェクトでは、 'redux-state'要素が' undefined 'の場合は 'loading'のデータを考慮し、' isLoading'フラグは省略します。これは良いか悪い練習ですか? –

関連する問題