2017-07-26 8 views
2

について混乱反応し、私は、このようなウィンドウサイズを取得するなどの基本的な機能を実行するapp.jsxコンポーネントを持って、API関数を呼び出すことにより、ユーザ情報を読み、などは、アプリを私は実行順序

これは本当にトップレベルでありますエントリポイントのコンポーネント。これは私のエントリポイントは次のようになります。私が混乱している何

render (
    <Provider store={store}> 
     <App> 
      <HomePageComponent /> 
     </App> 
    </Provider>, 
    document.getElementById('app') 
); 

は、ホーム・ページ・コンポーネントで、私はサブコンポーネントの束を持っているということです。ホームページ内のサブコンポーネントのcomponentDidMount()機能がの前にを実行しているように見え、AppコンポーネントのcomponentDidMount()機能です。

これは正常に動作するはずですか?内側から?私は最初に実行すると考えているAppコンポーネント内のユーザー情報を取得するような基本的なハウスメンテ機能を入れていました。

答えて

0

はい、これは予想される動作です。 this号にそれについての議論があります。

いくつかのハイライト:

componentDidMountが親-最初に実行した場合、すべての子ノードが、この時点でマウントされていないので、あなたは見つけるだろう唯一のことは、あなたのノードがあります。これにより、componentDidMountは大部分のユースケース(たとえば、offsetWidthのカウント、サードパーティの非リアクションプラグインの追加など)では役に立たなくなります。 (ガーソン)

これはバグではありませんが、多分混乱しているドキュメントです。これはDOM要素の作成順序です。とにかく(ルートがドキュメントから外れる可能性があるので)私たちが保証することはできないので、ドキュメント内にあるかどうかは関係ありません。 (sebmarkbage)

テクニカルライフサイクルメソッドは、特定のコンポーネントがマウントされていることを保証します。それは子供たちに関して何の約束もしていない。この順序に依存することは、通常、コンポーネントのカプセル化境界を壊していることを示しています。あなたのcookingsのための最初の操作をロードする(sebmarkbage)

+0

ありがとうございました!それで、これらのハウスキーピングアイテムを扱う最良の場所はどこですか?あるいは、すべての親コンポーネントと副コンポーネントから一般関数を呼び出す方がよいので、最初にそこに入ると誰でもこの一般関数を実行することができます。私はいくつかのロジックを使用して、API呼び出しを何度も繰り返さないようにすることができますが、データは私のreduxストアまたはlocalstorageにローカルに保存されます。 – Sam

+1

@Sam renderメソッドの外でも、いつでもウィンドウサイズを取得できます。そして、あなたは 'API'呼び出しが返されたかどうかに基づいて、あなたの' App'コンポーネントに条件付きで子をレンダリングさせることができます。この「ハウスキーピング」質問には正解が1つしかありません。これは、あなたのアプリがどのように構築されているかに関する多くの変数に依存します。 – maxedison

+1

@Samこれにはさまざまな方法がありますが、私がやりたいことは、応答を待つ間にアプリケーションが読み込まれてマウントされるときにリクエストを撃退することです。それから、私のreduxストアとデータの流れを更新します。これは、私のすべてのコンポーネントが、いくつかのプロパティが不足している可能性があり、スピンナーをレンダリングするか、または小道具が不足している場合には何も処理できないようにする必要があることを意味します。 – ivarni

0

使用

コンストラクタ()メソッド。 後でより良く理解するために

はい、これは動作するようになっています方法です React Component Life Cycle

1

を参照してください。..ようにあなたのcomponentDidMount()操作を提供して。これは、JSXのような問題ではありません。 JSXは関数呼び出しに変換するだけです。それはちょうど、次のようなものだ

React.createElement(
    Provider, 
    { store: store }, 
    React.createElement(
     App, 
     null, 
     React.createElement(HomePageComponent, null) 
    ) 
); 

:あなたのコードが変身例えば、その例で

doSomethingSecond(doSomethingFirst()); 

doSomethingFirstが最初に実行され、結果はdoSomethingSecondへの引数として渡されます。同様に、JSXで変換されたコードでは、React.createElement(HomePageComponent, null)が最初に実行され、結果はラップされたReact.createelementコールの引数として渡されます。

JSXがJSに変換される仕組みを、Babel's siteで知ることができます。

+0

意味があります。ありがとうございました。あなたは他の答えの下で私のコメントを見ていただけますか?これらのハウスキーピングアイテムを扱う際の最善のアプローチを見つけようとしています。 – Sam