Reactで認証機能を実装するときによく出てくるContext
と Provider
。
この記事では、Context
と Provider
の役割の違いをわかりやすく解説します!
🧠 ざっくり結論
名前 | 役割 | たとえ話 |
---|---|---|
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点セットの関係をしっかり理解しておくと、よりスムーズに開発できるようになります!