2016-06-19 4 views
2

私は現在、UIをレンダリングするのに必要なデータがあれば、状態readyToRenderをfalseに初期化し、trueに設定してコンポーネントのレンダリングを延期しています。Reactでコンポーネントのレンダリングを遅延させるための推奨デザインパターンは何ですか?

if (this.state.readyToRender) { 
    return (
    // render component 
)} else { 
    return false; // don't render component 
} 

が、これはこの問題のために活用するための正しいパターンですかこれを解決する良い方法があります:機能をレンダリングマイ

は何かのように見えますか?
関連の質問:すべての

+0

あなたのデータは小道具ですか? – omerts

+1

このロジックは完璧です。 – Chris

+0

私のデータは現在 'this.state'に保存されていますが、設計をやり直して、データを小道具として渡すこともできます。 –

答えて

1

まず、我々は代わりにthis.stateでそれを保持する、データから "ロードされた" 状態を導出してみてください。データは利用できませんが、スピナーを表示しますが、何も表示しない場合もあります。例えばので

const TextShower = (props) => { 
    if (props.text) { 
    return <div>{props.text}</div> 
    } 

    return <img src='https://s31.postimg.org/g3992fx7v/477.gif' /> 
} 

はフィドル:

const loaderComponent = (ComposedComponent, predicate) => { 
    return (props) => { 
    const isLoading = predicate && predicate(props) 

    if (isLoading) {  
     return <div className='loading-data'> 
       <img src='https://s32.postimg.org/8w18tbrlx/477_1.gif' /> 
      </div> 
    } 

    return <ComposedComponent {...props} /> 
    } 
} 
https://jsfiddle.net/omerts/8r3dh6hw/

我々はこのの世話のための高次成分を(ローダイメージは例が動作するように変更)も作成しました

使用法:

const TextShower = (props) => { 
    return <div>{props.text}</div> 
} 

const LoaderTextShower = loaderComponent(TextShower, 
             (props) => !props.text) 

フィドル:

はあなたのコンポーネント内の他の状態や小道具に基づいて、それを計算することができます:「で反応考える」のdocからhttps://jsfiddle.net/omerts/4edgbhmz/

?もしそうなら、それは国家ではない。

+0

ありがとう、私は状態から設定する代わりに小道具を渡すことによって、この段階的な方法で自分のUIを構築します。私は、投票が増えれば、この問題を解決するための好ましい方法であるとのコンセンサスを得ることができます。 –

関連する問題