Next.js 入門 状態管理をする簡単な方法

Reactアプリケーションで状態を管理するには、常にReduxが必要なわけではありません。

Reduxは、アプリケーションが複雑になり、状態管理が複雑になる場合に使用することが推奨される状態管理ライブラリの一つです。

Next.jsを使用してアプリケーション全体で状態を管理する場合、Reactライブラリの一部である「ReactContext」を使用することが最も簡単な方法です。

ただし、グローバル状態オブジェクトを使用することがすべての種類のプロジェクトで便利であるとは限りません。

アプリケーションの規模や性質に合わせて最適な状態管理方法を選択することが重要です。

React Contextについては、当ブログで詳しく解説しておりますので下記を参照下さい。

dev-k.hatenablog.com

Next.jsでReact Contextを使用する

まずは、「src」フォルダの中に「context」フォルダを作成し、その中に「state.js」ファイルを作成します。

このファイルには、コンテキストを定義し、ラッパーを提供するコードが含まれます。

src/context
     ├ state.js

次に、必要なReactフックをインポートします。

// src/context/state.js

// 必要なフックをインポートする
import { createContext, useContext } from 'react';

次に、「createContext」を使用してコンテキストオブジェクトを作成します。

// src/context/state.js

// コンテキストオブジェクトを作成する
const MyContext = createContext();

MyProviderコンポーネントを作成し、作成したコンテキストオブジェクトをラップします。ここで、共有される状態を宣言しています。

// src/context/state.js

export function MyProvider({ children }) {
  const sharedState = {
    number: 123,
    text: 'test'
  };

  return (
    <MyContext.Provider value={sharedState}>
      {children}
    </MyContext.Provider>
  );
}

最後に、カスタムフック 「useMyContext」を作成して、状態データにアクセスできるようにします

// src/context/state.js

// コンテキストオブジェクトにアクセスするためのカスタムフックを作成する
export function useMyContext() {
  return useContext(MyContext);
}

これで、コンテキストオブジェクトを使用するための基本的な準備が整いました。

コンテキストの使用

コンポーネントからコンテキストオブジェクトにアクセスするには、「useContext(MyContext)」を使用します。

下の例では、コンテキストオブジェクト内のデータを準備しています。

// src/context/state.js

// 必要なフックをインポートする
import { createContext, useContext } from 'react';

// コンテキストオブジェクトを作成する
const MyContext = createContext();

// コンテキストをラップするMyProviderコンポーネントを作成する
export function MyProvider({ children }) {
  const sharedState = {
    number: 123,
    text: 'test'
  };

  return (
    <MyContext.Provider value={sharedState}>
      {children}
    </MyContext.Provider>
  );
}

// コンテキストオブジェクトにアクセスするためのカスタムフックを作成する
export function useMyContext() {
  return useContext(MyContext);
}

上記のコードを使用して、アプリ内の任意の場所で共有される状態にアクセスできます。

任意のファイルまたは既存の「index.js」ファイルでインポートして、コンソールで確認してみてください。

// pages/index.js

import { useMyContext } from './src/context/state';

console.log(useMyContext());

実際は、以下のように変数として格納しておく事を推奨します。

import { useMyContext } from './path/to/context';

function MyComponent() {
  const sharedState = useMyContext();

  // 共有される状態にアクセスするためにsharedStateを使用する
  // ...
}

これで、Next.jsアプリケーションのすべてのコンポーネントとページで「useMyContext」のカスタムフックで作成した、コンテキストで共有されている状態にアクセスが可能となりました。

特定のコンポーネント間でページを共有できる場合は、ページ間で不要な再レンダリングを行う必要はありません。

最後に

Reactを使った開発では、状態管理が重要なテーマの1つです。

前述で、「ページ間で不要な再レンダリングを行う必要はありません。」と言いましたが、少し誤解を招く可能性があるため、説明させて頂きます。

状態管理には、Reactに標準で備わっている「State」や「Reducer」を使うことができますが、一般的には、複数のコンポーネントで共有される状態を管理するために「Context」を使用します。

ただし、「Context」は複数のコンポーネントで共有されるため、一つの「Context」で複数の状態を管理すると、不必要な再レンダリングが起こることがあり、パフォーマンスの問題が生じる可能性があります。

そのため、複数の状態を共有する場合は、それぞれの状態に対応する「Context」を複数作成することが望ましいです。

ただし、すべての状態を「Context」で管理することが最適な方法であるとは限りません。

必要に応じて、「Redux」や「Recoil」および「MobX」などのライブラリを使用することもあります。

以上がReactを使ったNext.jsでの状態管理の一般的な方法についての説明でした。

最後まで読んでいただき、ありがとうございました。

この記事が役に立ちましたら、ブックマークし他の方にも共有して頂けると嬉しいです。

プライバシーポリシー

© 2023 Icons8 LLC. All rights reserved.

© [deve.K], 2023. React logo is a trademark of Facebook, Inc. JavaScript is a trademark of Oracle Corporation and/or its affiliates. jQuery and the jQuery logo are trademarks of the JS Foundation. TypeScript and the TypeScript logo are trademarks of the Microsoft Corporation. Next.js and the Next.js logo are trademarks of Vercel, Inc. Firebase and the Firebase logo are trademarks of Google LLC. All logos edited by [deve.K].