2016-07-04 10 views
6

リアクション文書には、ライフサイクルイベント react docs react docs)からajaxリクエストを開始する必要があることが記載されています。ReactコンポーネントのcomponentDidMountでajaxリクエストを行う必要があるのはなぜですか?

なぜこのイベントですか?

AJAXを使用してデータをロードする際、ほとんどのケースでは、私はロードバーのいくつかの種類を表示したい、例えば:

componentDidMount() { 
    this.setState({isLoading: true}); 
    fetch(...) 
     .then(...) 
     .then(() => this.setState({isLoading: false}) 
} 

が、これはrender方法を3回発射(immediatellyその後、isLoading = trueを設定することが続き、レンダリング初期componentWillMountイベントからAJAX要求を送信することについて間違って何isLoading = false

で?

+0

Reactドキュメントでは、なぜcomponentWillMountではなく、componentDidMountでAJAXを実行することを推奨するのですか?(http://stackoverflow.com/questions/27139366/why-do-the-react-docs-recommend-doing-ajax -in-componentdidmount-not-componentwi) – mattias

答えて

3

まあ、isLoading: trueは初期状態、不要の一部とすることができますコンポーネントがhttps://github.com/reactjs/react-redux/issues/210によると=>のみ2レンダリングではなく、3

をマウントした後、それを設定するには、componentWillMountから一度だけrenderを呼び出した結果はsetStateが非同期render後に呼び出されます場合は、それがいずれかを持っていないことを意味します効果(私がコメントを正しく理解していれば)。

setStateのコールバックがrenderより前に実行される可能性があるかどうかわからないため、ロードする画面は表示されず、結果のみが表示されるため、ときどき(実際にはDEVの場合)デバッグに非常に厳しいレースコンディションになり...

https://facebook.github.io/react/tips/initial-ajax.html

+0

問題は修正されているので、componentWillMountから呼び出されるsetStateはレンダリング前に有効になります。反応文書では、なぜcomponentDidMountでajax呼び出しを行うべきかについての説明はまだありません。 – Liero

+0

よく、componentWillMountやcomponentDidMountから 'setState'を直接呼び出すのではなく、新しい非同期スタックから呼び出してください。さまざまな方法のライブイベントリスナーで「this」の参照を保持するために、どのように反応が正確に実装されているかわかりません。もし文書化されていない機能を使用するのがあなたのために十分な怖さではなく、それが将来のバージョンでもうまくいくかもしれないという興奮がほしいと思うなら、無料で、私はそれが壊れているかどうかわからない – Aprillion

0

ポイントを参照してください、あなたはあなたがロードバー(ロード:true)を参照するようにコンポーネントが初期状態でレンダリング反応させています。

componentWillMount()でthis.setState({isLoading:true})行を移動できます。 componentWillMountの設定状態ではコンポーネントの再レンダリングが行われません。レンダリングメソッドは更新されたコンポーネントを取得します。

+0

しかし、 'this.setState({isLoading:true}) 'を分割し、ajaxは2つのライフサイクルイベントを呼び出します。私はまだajax呼び出しがcomponentWillMountではなくcomponentDidMountで行われるべきであるかどうか分かりません – Liero

関連する問題