RecoilのLoadableとRefresherでデータの非同期取得状況の表示周りをスッキリ
Recoilは素晴らしいというお話。
以下のような、ニュースの記事を並べて表示するアプリを考える。
各記事はインターネット経由等で非同期で読み込む必要があり、それぞれ「読み込み中」「読み込み成功」「読み込み失敗」の状態が付随する。
このようなものを実装する時に役立つのがRecoilの useRecoilValueLoadable と useRecoilRefresher_UNSTABLE である。
Loadable
まず、useRecoilValueLoadableを使用すると、各情報に読み込み状態を付随させることができる。具体的には
const xState = selector( 記事を非同期で読み込んで返す )
const x = useRecoilValue(xState)
// 値 x が取れた
であるところ、この useRecoilValueLoadable を使うだけで
const xState = selector( 記事を非同期で読み込んで返す )
const xLoadable = useRecoilValueLoadable(xState)
// xLoadable.stateで読み込み状態を取得
// xLoadable.contentsで読み込んだ結果を取得
という風に、特に追加のコーディングもせず読み込み状態をすぐ知れるようになる。
これは大変画期的な機能である。Reduxでこの機能を実装するとなると、
store内に fetchStatus という変数を設ける。
Action及びAction Creatorを3種類(「読み込み中」「読み込み成功」「読み込み失敗」)定義する。
ミドルウェアでの非同期処理の結果に応じて、これら3種類のActionが適切にdispatchされるようにする。
3種のActionに対応するReducerをこれまた3種作り、それぞれfetchStatusを変更するようにする。
という風に超面倒くさかった。さようなら、Redux。
Refresher
Refresherを作り、これを呼び出すと、記事を非同期で読み込む処理をもう一回やってくれる。
詳しくはこちらをご覧ください
今回紹介したニュース記事を表示するミニアプリのソースコードです。
疑問
今回実装した「記事を更新」以外に「4つの記事をまとめて更新」という機能はどうやって実装すればいいのだろうか?
「読み込み中」「読み込み成功」「読み込み失敗」以外のものとして、「読み込む前」というアイドル状態を作るにはどうすればいいのだろうか?
この記事が気に入ったらサポートをしてみませんか?