✅2023/8/23 gettersの返り値はatomではなくvalueでないといけない
from jotai-decode-form
2023/8/23 get等の返り値はatomじゃなくてvalueじゃないといけない
今の実装だと、↓のようにアクセスして分岐等ができない
atomの中身にアクセスできない
code:ts
atomForm(({get}) => {
const t = get(typeAtom)
if(t === 's') //
})
3つの案を思いついてる
そもそもgetterを3つに分けてるのがおかしい説
共通の、通常のgetを提供して、内部で変換する
通常のgetだが、型で3種類のみを渡せるようにする
内部ではisFieldとかで3つを識別し、元やっていたような正規化を行う
しかし、これをすると、field atomに対する依存が消えてしまう
普通のjotaiのatomでそれで機能するのは、そのケースではsetterを書かせるから。
つまり、atomFormの使用時に毎度setter処理を書かないといけなくなる
自明なのに
今回の場合は、setterは自明なので書く必要はない
例えば、こんな感じにすると、atomFormの引数であるreadは通常のobjectを返す関数になる
atomFormの内部で、fieldAtom自体への参照が持てないので、getはできるけどsetができない
code:ts
const formAtom = atomForm((get) => ({
field: get(fieldAtom),
}));
各fieldに対するset処理を全部書かないといけなくなってかなり利便性が落ちる
3つのinterfaceはそのままに、型を変えて、atomではなくvalueを返すようにする
各fieldがatom
実装の方針が立たなくて困ってる
これのメリットは、分岐を利用者が行うので内部実装は単純になる
利用者が若干めんどい
メリットは「setterを書かなくて良い点」とは言えそう
getをgetAtomに変えた上で、getを生やす
名前がズレてるが、通常のgetterであるgetを用意する
他3つはそのままで、atomを返す
これは一瞬で実装できたが、本当にこれで良いのか感あるmrsekut.icon
利用者目線だとこれが一番意味不明
何のために4種類のメソッドを分けて使わされているのか理解できない
ft-fix-add-get
Getterには2つの機能がある
type Getter = <Value>(atom: Atom<Value>) => Value
atomからValueを取り出す
元のatomからの参照を断つ
たぶんわかった
通常のatomと同様にgetのみを提供する
返り値は3種類のatomのみを受け付ける
これはgetするのではなく、元のatomをそのまま渡す
内部では3種類のどれであるかを判別する
型で制限されているので割といけるはず
内部では元の実装となじような変更を施し、元の処理と同じようなことをする
例
code:ts
const formAtom = atomForm(get => ({
field: fieldAtom,
}));
これはgetを使ってないが
todos
rebaseする
最初の2つのcommitいらん
getters周りのdirとfileのrenmae
getterじゃないし
名前どうにかする
commitぐちゃぐちゃになったので別branchでやり直してもいいかもしれない
実装はできたが型を合わせられない..
一応できたが、利便性的には逆向きなんだよな...
なんか命名が雑すぎるんだよなmrsekut.icon
Values
formの実際の値
values: Valuesなので。
code:ts
type FormValues = Record<string, unknown>;
AtomFields
これが良くない
Valuesと同じ構造だが、値が何らかのatomになってる
FieldResultsAtom
record全体がatom
正規化した後のやつ
各値がFieldAtomになってる
これも良くない
AtomFormReturn
畳み込んだ結果
遷移していく概念をmoduleで分割するとわかりやすくなりそう
個々のAtom (の集合) (AtomFields)
↓ 正規化
FieldAtom
↓ 畳み込み
AtomFormReturn
型の箇所一部妥協していったんpublishしようやmrsekut.icon
https://github.com/mrsekut/jotai-decode-form/pull/11
v0.4