Open11

Jotaiメモ

RerrahRerrah

selectAtom

readonlyなderived atomとselectAtomはどちらも同じことができるけど,selectAtomは以前のatomの値と比較して処理が行えるのが違い?

https://jotai.org/docs/utilities/select

RerrahRerrah

基本的にはderived atomを使用して,それでも回避できないときのみ使用する.

⚠️Unlike its name, selectAtom is provided as an escape hatch. Using it means building not 100% pure atom model. Prefer using derived atoms and use selectAtom only when equalityFn or prevSlice is unavoidable.

RerrahRerrah

splitAtom

配列をatomとして管理すると,その一つの要素を変更したときにほかの要素を参照しているコンポーネントも再レンダリングされてしまう.これを避けるには配列の要素をatomで包むようにする.
splitAtomを使うと引数に渡した配列のatomに対して各要素をatomで包んだatomを作成してくれる.

const atomList = atom([1, 2, 3]);       // PrimitiveAtom<number[]>
const atomsAtom = splitAtom(atomList);  // Atom<PrimitiveAtom<number>[]>

https://jotai.org/docs/utilities/split

RerrahRerrah

配列の子要素だけを変更したときに,memo()しなくても編集対象外のコンポーネントの再レンダリングが抑制されるのは便利.

RerrahRerrah

useAtom or useState

コンポーネント内の状態管理にはReact HooksのuseStateを使っても,JotaiのuseAtomを使っても良い.ただそのコンポーネントの状態を外部で参照する可能性が出てくるかもしれない.それだったら最初からuseAtomにしてもよいのでは.どうしても限定したければProviderを使うのも手.

2つの手法を使ってやっていくと面倒くさいので,Jotaiを使っているのなら全部atomで管理したほうが楽そう...

RerrahRerrah

でも,Providerが大量に作成しないといけない場合は大変なので,React Hooksを使った方がいいかも(リストの要素内の状態管理など)...

RerrahRerrah

あたりまえだけど,Providerの内部のコンポーネントでglobalや上位コンテキストのatomを使用したいときは,その外でuseAtomして値や設定関数を取得しておき,Provider内部のコンポーネントにはイベントハンドラーの形で渡す必要がある.

function Parent(): React.JSX.Element {
  const setValue = useSetAtom(globalAtom);
  const setFunc = (newValue) => setValue(newValue);
  return (
    <Provider>
      <Child func={setFunc} />
    </Provider>
  );
}
RerrahRerrah

ローカルなatomになるにはそのuseAtomが呼び出されているコンポーネント自体をProviderで囲まないとダメ.