拡張系atomでgetterが欲しい場合にどうするか
#WIP
タイトル直す↑mrsekut.icon
まとめる↓mrsekut.icon
https://jotai.org/docs/guides/composing-atoms#extending-atoms-with-atomwith-utils
docsにそれぽいのがあった
一旦別の方法で解決して課題感がなくなったので保留
通常のJotaiのatomは、getterを渡したり渡さなかったりできる
code:使用例.ts
const priceAtom = atom(10)
code:使用例.ts
const readOnlyAtom = atom((get) => get(priceAtom) * 2)
同様に、例えば何でも良いがatomWithResetのような拡張系atomでは、getを引数に取る記法をサポートしていない
そうすると、別のatomに依存する初期値を持つようなatomWithResetは定義できない?ということになる
しかし、こういう動機はいくらでもあるはずだが、サポートしていないということは何かしら組み合わせで対処できるはず
atomWithSchemaでも同様の問題が起き、実装を変えてサポートしようとしたが、異常に複雑になる。さて
これを統一的に扱える書き方がわかれば色々解決する
例えばこんな感じ
code:ts
const bAtom = atom(true);
const aAtom = atom(get => {
const b = get(bAtom);
if (b) {
return atomWithReset(1);
} else {
return atomWithReset(2);
}
});
しかし、aAtomはatom in atomになってしまう
こうか?
code:ts
const aAtom = atom(get => {
const b = get(bAtom);
if (b) {
return get(atomWithReset(1));
} else {
return get(atomWithReset(2));
}
});
atomWithReset知らんので適当に書いてる
setterいけるか?
こうもかける
code:ts
const bAtom = atom(true);
const r1 = atomWithReset(1);
const r2 = atomWithReset(2);
const aAtom = atom(
get => {
const b = get(bAtom);
if (b) {
return get(r1);
} else {
return get(r2);
}
},
(get, set, args: number) => {
set(r1, args);
set(r2, args);
},
);
1個しか使わないのに、分岐の数だけatomを用意するのも馬鹿らしい
flatするような機構だったり、別の書き方で同じようなことを実現したりできないか
仮に無理なのだとしたら、拡張atom系は、atomWithResetみたいに拡張atomを提供するのではなく、getter/setter用の関数を提供したほうが良いのではないか
Discussionで聞いてみると良さそう
活発そうだし