React.js Context API เป็นเครื่องมือที่ทรงพลังแต่ก็มักถูกใช้งานผิดวิธีหลายโปรเจกต์จนอาจเจอกับปัญหาเช่น
✅ เหมาะกับ Context API
❌ ไม่เหมาะกับ Context API
export const AppContext = createContext();
<AppContext.Provider value={{ user, setUser, theme, cart }}>
ปัญหา
AuthContext.jsx
import { createContext } from "react";
export const AuthContext = createContext(null);
AuthProvider.jsx
import { useState } from "react";
import { AuthContext } from "./AuthContext";
export function AuthProvider({ children }) {
const [user, setUser] = useState(null);
const login = (userData) => {
setUser(userData);
};
const logout = () => {
setUser(null);
};
const value = {
user,
isAuthenticated: !!user,
login,
logout,
};
return (
<AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
);
}
📌 ข้อดี
useAuth.mjs
import { useContext } from "react";
import { AuthContext } from "./AuthContext";
export function useAuth() {
const context = useContext(AuthContext);
if (!context) {
throw new Error("useAuth must be used within AuthProvider");
}
return context;
}
📌 ข้อดี
Profile.jsx
function Profile() {
const { user, logout } = useAuth();
return (
<div>
<p>Hello {user.name}</p>
<button onClick={logout}>Logout</button>
</div>
);
}
themeReducer.mjs
function themeReducer(state, action) {
switch (action.type) {
case "TOGGLE_THEME":
return {
...state,
mode: state.mode === "light" ? "dark" : "light",
};
default:
throw new Error("Unknown action");
}
}
ThemeProvider.jsx
import { createContext, useReducer } from "react";
export const ThemeContext = createContext(null);
export function ThemeProvider({ children }) {
const [state, dispatch] = useReducer(themeReducer, {
mode: "light",
});
const toggleTheme = () => {
dispatch({ type: "TOGGLE_THEME" });
};
return (
<ThemeContext.Provider value={{ ...state, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
}
📌 ข้อดีของ Reducer Pattern
แตกเป็นหลาย Context ดีกว่า Context ขนาดใหญ่เพียงหนึ่งเดียว
<AuthProvider>
<ThemeProvider>
<LocaleProvider>
<App />
</LocaleProvider>
</ThemeProvider>
</AuthProvider>
📌 ข้อดีของ Multiple Context
✅ เหมาะกับ Context API
✅ ควรทำเสมอ
❌ ควรหลีกเลี่ยง