2016-07-07 11 views
4

JSONを返すバックエンドAPIへの非同期呼び出しで初期データを読み込もうとすると、問題が発生します。今、私はさまざまな記事を読み込もうとしていますが、非同期に読み込む方法はわかりません。それはデータの初期セットなので、同期して読み込む必要がありますか?はいの場合は、APIへの同期呼び出しをどのように達成できますか?そうでない場合は、この問題を非同期的に解決するにはどうすればよいですか?React reduxでajaxコールを使用してデータセットをロードするにはどうすればよいですか?

現時点では、store.jsにデフォルトの状態を作成する、静的なjsonデータdata/articles.jsがあります。

おかげ

+0

、ページのロードにページと一緒にデータを出荷考えます。これにより、ページの起動が大幅に高速化されます。ただし、データの量、バックエンドでのフェッチの所要時間、データが非同期的に読み込まれる前にユーザがアプリケーションを(部分的に)使用することが可能かどうかによっても遅くなる可能性があります。 – DDS

+0

データがロードされていない場合、ユーザーは実際にwebappで何もできません。これがまさに私が望むものだと思います。これをどうやってやりますか?ありがとうございます – Parkicism

+0

ちょうどバックエンドでページを準備しながらそれを取得します。スクリプトタグを使用して埋め込むことができます。ロード時に 'createStore'でロードすることができます。 Redux自体を使用して、サーバー上にデータを生成することもできます。あなたは 'store.getState()'でデータを取得して出荷することができます。 – DDS

答えて

4

あなたは、あなたの最初のデータをダウンロードするための非同期アクションと(例えば)fetchライブラリーを派遣することを可能にするredux-thunkミドルウェアを、使用する必要があります。

ので: 1)たとえば、あなたのデータをフェッチするアクションを作成:receiveYourDataはあなたの状態、例では、あなたのデータを配置するアクションです

export function fetchData() { 
    const options = { 
    method: 'GET', 
    headers: { 
     'Authorization': 'Client-ID xx' // if theres any needed 
    } 
    } 

    return (dispatch) => { 
    return fetch('yourUrl.json', options) 
     .then(response => response.json()) 
     .then(data => dispatch(receiveYourData(data))) 
     .catch(err => console.log(err)); 
} 
} 

export function receiveYourData (payload = []) { 
    return { 
    type: RECEIVE_DATA, 
    payload: payload 
    } 
} 

もちろん、アクションハンドラを記述する必要があります。アクションハンドラは、アクションをディスパッチした後、データを自分の状態にします。

上記のような設定をしている場合は、fetchDataをcomponentDidMountライフサイクルメソッド(もちろんオプションの1つ)にディスパッチする必要があります。

特定のパーツを行う方法がわからない場合は、Exampleを参照してください。

またofficial async例が役に立つかもしれ:)

+0

ご協力いただきありがとうございます。私はそれを完全に理解するために、この例を数回通らなければなりません。 – Parkicism

+0

問題はありません、幸運:) – MariuszJasinski

+0

componentDidMountはどこですか?コンテナ内またはコンポーネント自体の中にありますか? ありがとう – pikilon

1

私もこの問題を抱えていました。この単純な作業のために多くのコードを追加する必要があることが判明しました。そこで私はこのプロセスを単純化して、redux - redux-async-initial-stateの初期状態の非同期ロードのためのパッケージを作成しました。

あなたは例をチェックアウトすることができ、あなたの場合には、最終的に自分の店の作成者は、次のようになります。アプリの起動時にロードするデータに代わり

// Load initial state function 
const loadStore =() => { 
    return Promise(resolve => { 
    fetch('/data/articles.js') 
     .then(response => response.json()) 
     .then(resolve); 
    }); 
} 

const storeCreator = applyMiddleware(asyncInitialState.middleware(loadStore)); 
const store = storeCreator(reducer); 
関連する問題