非同期読み書きに対応するRecoil+Reactの構造提案①
Recoilを勉強してみて色々と考えている。非同期的な書き込み処理、読み込み処理をどう実装すればいいのだろうか。
概要
書き込み
![](https://assets.st-note.com/img/1644375614289-2Qwujjuh2X.png?width=1200)
Componentでユーザーが何かする。
ボタンを押したり
Enterキーを押したり
Component が Action を同期的に呼び出す。
Action が API Gateway を同期的に呼び出すと同時にハンドラーを設定する。
then
catch
API Gateway が API へ非同期的に書き込み処理を始める。
API Gateway が書き込み結果を Action のハンドラーに送る。
Action のハンドラーが書き込み結果に基づいて Atom を変更する。
Component がAtom に従って表示内容を変える。
![](https://assets.st-note.com/img/1644383629062-4u5KaIzZKq.png?width=1200)
読み込み
![](https://assets.st-note.com/img/1644375684627-72KPVyc8hy.png?width=1200)
Components が Selector の値を読もうとする。
Selector が API Gateway を非同期的に呼び出す。
API Gateway が API から非同期的に読み込み処理を始める。
Selectorsが読み込み処理の結果を返す。
Component が Selectorの返しているLoadableに従って表示内容を変える。
![](https://assets.st-note.com/img/1644383639420-X7oR7WJs4f.png?width=1200)
問題点
Recoilのeffectの出番がない。
Components, States, Actionsがひとつながりになっているので、分離してそれぞれテストをしづらい。
書き込みのActionsには細かく分けると2つの部分に分けられる。
API Gatewayを呼ぶ。
Statesを一括変更する。
Actionsでは一度に複数のStatesを変更することがある。例えばログインが成功すれば、
読み込み中かどうか←false
ログインしているか←false
エラーが発生しているか←false
エラーメッセージ←空文字
といったStatesの変更が起きる。これらを2つに分けるか否か。