🐥

オタクくん「ギャル先輩、Next.jsの状態管理ってどうしたらいいんですか?」

2024/05/30に公開

Next.jsの状態管理に困っているオタクくん

オタクくん「ギャル先輩、Next.jsの状態管理ってどうしたらいいんですか?」

ギャル先輩「え?Next.jsの状態管理?それって、具体的にどこで困ってるわけ?」

オタクくん「コンポーネント間でデータを共有したいんですけど、どの方法が一番いいのかわからなくて…」

ギャル先輩「なるほどね〜、初心者にはちょっとややこしいかもね。じゃ、基本的なところから教えてあげるよ〜」

Reactの状態管理の基本

ギャル先輩「まず、Next.jsはReactベースだから、基本的にはReactの状態管理の方法が使えるんだよね。例えば、useStateフックとか、useContextとかね。」

オタクくん「useStateは使ったことありますけど、useContextはよくわかってないです…」

ギャル先輩「おっけーおっけー。じゃ、まずはuseContextからいくよ〜」

import React, { createContext, useContext, useState } from 'react';

// コンテキストの作成
const MyContext = createContext();

const MyProvider = ({ children }) => {
  const [state, setState] = useState("Hello, world!");

  return (
    <MyContext.Provider value={{ state, setState }}>
      {children}
    </MyContext.Provider>
  );
};

const ChildComponent = () => {
  const { state, setState } = useContext(MyContext);

  return (
    <div>
      <p>{state}</p>
      <button onClick={() => setState("Hello, Next.js!")}>
        Update State
      </button>
    </div>
  );
};

const App = () => (
  <MyProvider>
    <ChildComponent />
  </MyProvider>
);

export default App;

ギャル先輩「こんな感じでコンテキストを作って、プロバイダーでラップすれば、子コンポーネントでその状態にアクセスできるようになるんだよ〜」

オタクくん「なるほど、これなら状態を共有できるんですね!」

Next.jsでの状態管理

ギャル先輩「次に、Next.jsならではの方法もあるんだよね。例えば、getServerSidePropsとかgetStaticPropsを使えば、サーバーサイドでデータをフェッチして、ページコンポーネントに渡せるんだよ。」

オタクくん「サーバーサイドでデータを取ってくるんですね…それってどうやるんですか?」

ギャル先輩「こんな感じだよ〜」

export async function getServerSideProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: {
      data,
    },
  };
}

const Page = ({ data }) => {
  return (
    <div>
      <h1>Server-side Rendered Data</h1>
      <p>{data.message}</p>
    </div>
  );
};

export default Page;

ギャル先輩「これで、サーバーサイドでフェッチしたデータをページコンポーネントのプロップスとして受け取れるんだよね〜」

オタクくん「すごいですね!これでデータの取得も簡単にできるんですね」

状態管理ライブラリの導入

ギャル先輩「でもね、もっと大規模なアプリになると、これだけじゃ足りなくなることもあるんだよね。そんなときは、ReduxとかRecoilみたいな状態管理ライブラリを使うのもアリだよ〜」

オタクくん「ReduxとかRecoilって聞いたことありますけど、使い方が全然わからないです…」

ギャル先輩「じゃ、Recoilの基本的な使い方を教えてあげるよ〜」

import { atom, selector, useRecoilState, useRecoilValue } from 'recoil';

// Atomの定義
const textState = atom({
  key: 'textState',
  default: '',
});

// Selectorの定義
const charCountState = selector({
  key: 'charCountState',
  get: ({ get }) => {
    const text = get(textState);
    return text.length;
  },
});

const TextInput = () => {
  const [text, setText] = useRecoilState(textState);

  const onChange = (event) => {
    setText(event.target.value);
  };

  return (
    <div>
      <input type="text" value={text} onChange={onChange} />
      <br />
      Echo: {text}
    </div>
  );
};

const CharacterCount = () => {
  const count = useRecoilValue(charCountState);

  return <>Character Count: {count}</>;
};

const App = () => (
  <div>
    <TextInput />
    <CharacterCount />
  </div>
);

export default App;

ギャル先輩「Recoilはこんな感じで、状態をatomっていう形で管理して、selectorでその状態を元にした値を計算できるんだよ〜」

オタクくん「なるほど、これなら複雑な状態管理も簡単にできそうです!」

状態管理のまとめ

オタクくん「ギャル先輩、本当にありがとうございました!これでNext.jsの状態管理が少しわかった気がします!」

ギャル先輩「ふふん、どういたしまして〜。てーか、あーしの教え方、わかりやすかったっしょ?www」

オタクくん「はい、本当に助かりました!ギャル先輩、すごいです!」

ギャル先輩「もっと聞きたいことがあったら、いつでも聞いてね〜。じゃ、次はどんな質問してくれるかな?www」

オタクくん「うーん、また困ったときにお願いします…(ギャル先輩、実はすごく優しいんだな…)」

以上、オタクくんとギャル先輩によるNext.jsの状態管理についての会話でした。次回もお楽しみに!

Discussion