ProviderとContextの違い

Reactで認証機能を実装するときによく出てくるContextProvider

この記事では、ContextProvider の役割の違いをわかりやすく解説します!


🧠 ざっくり結論

名前役割たとえ話
Context認証情報を共有するための「箱」「電源コンセント本体」
Providerその箱に中身を詰めて提供する「供給元」「コンセントに電気を流す人」

👀 AuthContextとは?

export const AuthContext = createContext<AuthContextType | undefined>(undefined)
  • ReactのContextオブジェクトです。
  • 認証情報(ログインユーザーなど)をグローバルに共有するための”箱”を作ります。
  • この時点では中身は空っぽ。

つまり、「みんなで共有するための箱を用意しただけ」の状態です。


⚙️ Providerとは?

export const AuthProvider = ({ children }: { children: React.ReactNode }) => {
  const [user, setUser] = useState<User | null>(null)
  const [isAuthenticated, setIsAuthenticated] = useState(false)

  // ...ログイン・ログアウト処理など...

  return (
    <AuthContext.Provider value={{ user, login, logout, isAuthenticated }}>
      {children}
    </AuthContext.Provider>
  )
}
  • Context に値をセットしてアプリ全体に渡すコンポーネントです。
  • 実際の認証状態やユーザー情報を持っていて、それを 〜〜Context.Provider を通して子コンポーネントに供給しています。

要するに、「箱に実際のデータを入れて使えるようにする」のがこの Provider です。


🧩 関係性まとめ

// AuthContext:状態を共有する「箱」
export const AuthContext = createContext<AuthContextType | undefined>(undefined)

// AuthProvider:その箱にデータを詰めて、子コンポーネントに提供する
<AuthContext.Provider value={...}>
  {children}
</AuthContext.Provider>

// useAuth:その箱からデータを取り出すフック(カスタムフックで分離して使うと便利!)

🔌 たとえ話でイメージすると…

  • Context:電源コンセントの”差込口”
  • Provider:そこに電気(データ)を流す人
  • use〜〜():その電気を使うためのプラグ

📝 実際にどう使う?

// App.tsx
import { AuthProvider } from './contexts/AuthContext'

const App = () => (
  <AuthProvider>
    <YourAppRoutes />
  </AuthProvider>
)

こうすることで、<YourAppRoutes />以下のすべてのコンポーネントが useContext(AuthContext)useAuth() を使ってログイン状態にアクセスできるようになります!


✅ まとめ

  • Context:共有のための「状態の箱」
  • Provider:その箱に実際の値を入れてアプリ全体に届ける
  • use〜〜():その箱から値を取り出すカスタムフック(分けておくと便利)

Reactで認証状態を管理する際には、この3点セットの関係をしっかり理解しておくと、よりスムーズに開発できるようになります!