【Jotai】useHydrateAtomsを毎回発火させる

こんにちは、フリーランスエンジニアの太田雅昭です。

useHydrateAtoms

useHydrateAtomsはServerからClientに簡単にデータを渡せる関数です。useEffectや待機処理を別途書く必要がなく、とても便利な関数です。

一度実行されると更新されない

useHydrateAtomsは一度実行されると、値が変更されたとしても再実行はされません。そのため

  • Serverから値を渡す
  • Clientで値を反映させる
  • Serverから違う値を渡す
  • Clientで値が変わらない

といったことが発生します。

Providerとkeyを併用する

この解決のためには、Providerとkeyを使用します。

JotaiのProviderを使用してatomのスコープを限定します。またURL由来のキーを当てることで、変更が反映されるようにします。

"use client"

type ClientProps = {
  data: any;
}

export function Client(props: Props){

  // URL由来のキーを生成
  const pathname = usePathname();
  const searchParams = useSearchParams();
  const key = `${pathname}?${searchParams.toString()}`;

  // Providerを使用してスコープを限定する
  return <Provider key={key}>
    <Child {...props} />
  </Provider>
}

function Child(props: Props){
  useHydrateAtoms([[dataAtom, props.data]]);

  return <div>
    ...
  </div>
}

これでserverのデータがclientに反映されるようになります。