nomurabbitのブログ

nomurabbitのブログはITを中心にした技術ブログです。

nomurabbitのブログ

【React】useContextマジ半端ないって【Hook】

こんにちは!nomurabbitです。今回はuseContextについて紹介したいと思います。

useState、useEffectの概要は、こちらの記事をご覧ください。

nomurabbit.hatenablog.jp

nomurabbit.hatenablog.jp

nomurabbit.hatenablog.jp

Reactのデータ受け渡し

Reactのコンポーネント間でデータをやりとりする方法は、親から子へpropsで渡すという方法があります。今回紹介するuseContextも、コンポーネント間でデータをやり取りする方法です。ただ、このuseContextという機能、Reactのコンポーネントツリー内で共通変数を扱う上でこの上なく便利な機能なんです。この記事では、使い方本番での使いどころを、サンプルプログラムや動画を交えて紹介していきます。

それでは、まずは使い方からご覧ください!

useContextの使い方

まずは共通変数を保持するためのコンポーネントを作成します。このコンポーネントはReactコンポーネントツリーの親になるので、propsとして子のコンポーネントを受け取れるようにしておきましょう。具体的にはpropsReact.ReactNode型の要素を定義しましょう。

interface Props {
    children: React.ReactNode;
}

次に同じコンポーネントに通変数を保持するコンテキストを定義します。createContextにコンテキストの型初期値を渡してあげればOKです。下の例ではIauthContextが型でinitializeAuthContextが初期値となります。型の要素は文字列や数値のほか、関数を定義できるのでセッターを定義しておくとGoodです。また、コンテキストは定数(const)で指定してしまって問題ありません。

interface IauthContext {
    userId: string;
    setUserId: (name: string) => void;
}

const initializeAuthContext = {
    userId: "",
    setUserId: () =>{}
}

export const AuthContext = createContext<IauthContext>(initializeAuthContext);

以上で親コンポーネントは準備完了です。index.tsxで子コンポーネントを囲って、コンポーネントから親のコンテキストにアクセスしてみましょう。

index.tsx

ReactDOM.render(
  <React.StrictMode>
    <AuthComponent>
      <App />
    </AuthComponent>
  </React.StrictMode>,
  document.getElementById('root')
);

コンポーネントからのアクセス方法はとっても簡単です。先ほど作成した親コンポーネントからコンテキストを参照するだけです。下記のサンプルだとuserIdsetUserIdを参照してますね。

Home.tsx

import React, { useContext } from 'react';
import ResponsiveDrawer from '../components/layout/ResponsiveDrawer';
import {AuthContext} from '../components/auth/AuthComponent';

const Home = () => {
  const { userId, setUserId} = useContext(AuthContext);
  return (
    <ResponsiveDrawer>
      <div>
        <p>home page.</p>
        <p>user is {userId}</p>
        <button onClick={() => {setUserId("new " + userId)}}>
          Click me
        </button>
      </div>
    </ResponsiveDrawer>
  );
}
  
export default Home;

早速うごかしてみましょう!

React useContextのうごき

今回、homeとportraitの2つの子コンポーネントを用意しました。コンポーネントを遷移してもそれぞれ共通の変数を参照できていることが確認できると思います。

https://cdn-ak.f.st-hatena.com/images/fotolife/n/nomurabbit/20211216/20211216002924.gif

React useContextの使いどころ

最後にuseContextの使いどころですが、なんと言っても認証関係です。ユーザーが誰なのか?セッションは有効なのか?などなど、認証まわりの情報をコンテキストに保持しておくことで、UXに優れたWebアプリケーションを構築できます。また、画面遷移の履歴やテキストボックスの内容などを保存しておくことで、ユーザーのストレスを軽減することができるかもしれません。いずれにせよ、useContextはより良いReactアプリケーションを構築する上で必須の機能だと言えます。

まとめ

以上がReact useContextの紹介となります。useContextの半端ない重要性半端ない使い勝手の良さをなんとなくでも感じていただけたのではないでしょうか?みなさんもuseContextを使い倒して、より良いReactアプリケーションを作っていきましょう!

GitHubに今回のソースコードを載せていますので、参考にしてみてください。

github.com

次回もぜひご覧ください。では!