useRecoilCallback
subscribeさせずにatomを読み込む関数を定義できる
関数を実行したタイミングでatomを取得する
通常のatomへのアクセスでは、依存しているatomが更新されたら、再renderingされてしまうが、これを使えば回避できる
useCallbackのRecoil版
第2引数は、deps
返却されるのは関数
内部で提供される関数
snapshot
関数実行時のrecoil stateを取得する
gotoSnapshot
snapshotを上書きする
set
atomをupdate
reset
atomをdefault値にする
refresh - Refresh selector caches.
transact_UNSTABLE
code:ts
const updateLine = useRecoilCallback(
({ set, snapshot }) => async (ln: Ln, value: string) => {
const ids = await snapshot.getPromise(displayLids(noteId));
set(noteLineS({ noteId, lid: idsln }), value); },
[],
);
recoil stateであるlineを更新するが、その際に「現在のstate」が必要になる
この時に、snapshot経由で現在のstateを取得している
このため、以下の両方を両立できる
method呼び出し時に、現在のrecoil stateにアクセス
別の機会にrecoil stateが更新された時に、このhooksの呼び出し元を再renderingしない
ただ取得してsetしたいのなら、map使えばいいのか?mrsekut.icon
snapshot.getLoadbleってすることある #?? こんな感じで使う
code:ts
const hasItem = useRecoilCallback(
({ snapshot }) =>
(item: PostingItem) => {
const items = snapshot.getLoadable(postingItems).valueMaybe() ?? [];
return items.some(i => equal(i, item));
},
[]
);
本当の意味で「今のsnapshotがほしい」ときってあまりない気がする
同期的に扱いたい、同期的に扱っても大丈夫、という暗黙の保証がある場合にgetLoadableを使うというイメージだろうか