📱

Next.jsでページ共通の処理をする(useEffectを使う例)

に公開
7

Discussion

Shuhei MatsuokaShuhei Matsuoka

1. アプリのマウント時にログインユーザーの情報を取得して、グローバルステートにセット の次のコードについて質問させてください!

function MyApp({ Component, pageProps, router }: AppProps) {
  // ↓ グローバルステートにユーザー情報をセットするためのもの
  const setCurrentUser = useSetRecoilState(currentUserState);

  useEffect(() => {
    (async function () {
      try {
        const { currentUser } = await fetchCurrentUser(); // サーバーへのリクエスト(未ログインの場合は401等を返すものとする)
	// ログインユーザーの情報が取得できたのでグローバルステートにセット
        setCurrentUser(currentUser);
      } catch {
        // 未ログイン(未ログイン時のリダイレクト処理などをここに書いても良いかも)
        setCurrentUser(null);
      }
    })();
  },[])

  return <Component {...pageProps} />
}

自分はいまNext.jsとRecoilを勉強中なんですが、間違っていたらすいません。
自分が理解している範囲では、Recoilを使うには次のようにRecoilRootで囲う必要があり、

<RecoilRoot>
  <Component {...pageProps} />
</RecoilRoot>

またuseSetRecoilStateを呼ぶことはRecoilRootで囲った子コンポーネントでしかできないと思うんですよ。

上記はどうやるんでしょうか?
自分の理解が間違っていたらぜひ教えてください。
よろしくお願いします!

Zenn最高です!

catnosecatnose

<RecoilRoot>、入れ忘れてました!
修正しました。ご指摘ありがとうございました。

cotaponcotapon

またuseSetRecoilStateを呼ぶことはRecoilRootで囲った子コンポーネントでしかできないと思うんですよ

私もこれが気になりまして、 <RecoilRoot> がある _app.tsxsetCurrentUser すると、
Error: This component must be used inside a <RecoilRoot> component.
というエラーが出るので、 上記のコードでは、 _app.tsx 内で stateを更新することはできない気がしますが、どうすればいいでしょうか??

catnosecatnose

あ、そういうことですね。失礼しました。
useEffect部分(useSetRecoilStateを行う部分)を別コンポーネントに切り出せばOKだと思います。上述のコードもその形に修正しました。

cotaponcotapon

ありがとうございます!コードめちゃくちゃ参考になります!
あ、書き忘れてましたが、Zenn最高です!!

catnosecatnose

ご指摘ありがとうございました! && ありがとうございます!

Shuhei MatsuokaShuhei Matsuoka

ご回答ありがとうございます!!!!
最高です!!!!!