私は別の小さな自転車を共有したい-まず第一に、貴重なアドバイスを得るために。 追加の例は、GitHubファンプロジェクトのソースコードにあります 。
プロジェクトのほとんどすべてのページは、ページコンポーネントによってラップされます。
const MyPage = () => ( <Page> Hello World </Page> )
外部データをロードするために、ページコンポーネントには3つの渡されたプロパティ(プロパティ)があります。
- onMountedコールバック関数は、componentDidMountコンポーネントライフサイクルメソッド内で呼び出されます。 Reactのドキュメントによると、この場所で外部データをダウンロードすることをお勧めします。
- 外部データをロードする前に渡すisLoadingフラグはtrueで、この操作が完了した後はfalseです。
- 外部データのロードが失敗した場合、isNotFoundフラグを渡します。
Reduxの例:
isLoadingフラグは、propsに明示的に渡されず、PageコンポーネントのmapStateToPropsを介してバインドされることに注意してください(これについては後で説明します)。
式について質問がある場合:
...次に、MDNディレクトリを参照できます。
副作用actions.read(id)はredux-thunkを提供します:
データのロードが速すぎると、点滅するダウンロードインジケータの不快な視覚効果が発生します。 これを避けるために、500ミリ秒のタイマーとisTimeoutおよびisFetchフラグにロジックを追加しました。
Pageコンポーネントは、他の装飾を破棄する場合、外部データをロードするプロセスを提供します。
どのように機能しますか? 最初のレンダーパスは、_isMountedフラグをオフにして実行され、ロードインジケーターが表示されます。 次に、 ライフサイクルメソッドcomponentDidMountが実行され、_isMountedフラグがオンになり、onMountedコールバック関数が開始されます。 onMounted内では、副作用(たとえば、actions.read(id))が発生し、state.app.isLoadingフラグが有効になります。これにより、新しいレンダリングが発生します-ロードインジケーターは引き続き表示されます。 副作用内でaxios(またはフェッチ)を非同期に呼び出した後、state.app.isLoadingフラグをオフにします。これにより、新しいレンダーが発生します。ロードインジケーターを表示する代わりに、埋め込みコンポーネント(子)のレンダーが実行されます。 ただし、isNotFoundフラグの組み込みが機能する場合、ネストされたコンポーネント(子)のレンダリングの代わりに、<NotFound />のレンダリングコンポーネントが実行されます。