atomEffect
返り値はatom
atom版のuseEffectという感じ
mount時と、内部のatomが変更された時に実行される
例
code:ts
import { atomEffect } from 'jotai-effect'
const loggingEffect = atomEffect((get, set) => {
// runs on mount or whenever someAtom changes
const value = get(someAtom)
loggingService.setValue(value)
})
返り値であるloggingEffectはatom
これをuseAtomValueなどのhookで呼んでsubscribeを登録する感じ
そのComponentやatomがmountされたときに、atomEffectもmountされ購読が開始される
atomEffectもatom configなので、定義しただけでは何も起こらない
再帰的に更新できる
cleanup関数内では使えない
code:ts
const countAtom = atom(0);
atomEffect((get, set) => {
// increments count once per second
const count = get(countAtom);
const timeoutId = setTimeout(() => {
set.recurse(countAtom, increment);
}, 1000);
return () => clearTimeout(timeoutId);
});
atomの変化をsubscribeせずに値を参照する
code:ts
const countAtom = atom(0);
atomEffect((get, set) => {
const count = get.peek(countAtom)
})
Super excited to announce the initial release of jotai-effect! Kudos to @DavidMaskasky for the work. atomEffect has been requested since the early days, and it's now built on top of the latest ref 内部実装でinProgressで無限ループするのを防いでるっぽいが、恐らくこれが原因で初期化が上手くいかないことがあったmrsekut.icon