HOC là một hàm nhận vào 1 Component và trả về 1 Component mới "xịn hơn".
const EnhancedComponent = withSomething(BaseComponent);
1. Thời đại Hooks
Hooks giải quyết việc chia sẻ logic state. HOC giải quyết việc chia sẻ cấu trúc/lifecycle.
Ví dụ Hooks: useUser() lấy data user.
Ví dụ HOC: withAuth(Page) kiểm tra user, nếu chưa login -> Redirect. Nếu ok -> Render Page.
2. Code Mẫu: withAuth
tsx:
function withAuth(Component) {
return function AuthenticatedComponent(props) {
const user = useUser();
const router = useRouter();
useEffect(() => {
if (!user) router.push('/login');
}, [user]);
if (!user) return <LoadingSpinner />;
// Truyền props cũ + props mới (user) xuống
return <Component {...props} user={user} />;
};
}
// Usage
function Dashboard({ user }) {
return <h1>Xin chào {user.name}</h1>;
}
export default withAuth(Dashboard);3. Khi nào dùng HOC?
- Authenticated Routes: Bọc page để bảo vệ (như ví dụ trên).
- Tracking/Analytics:
withTracking(Button)-> Tự động gửi log khi click mà không cần sửa code Button. - Error Boundaries: Hooks không thể bắt lỗi render (chỉ class component làm được).
withErrorBoundary(Component)là giải pháp duy nhất.
4. Nhược điểm (Pitfalls)
- Prop Collision: Hook
useAuthtrả về propuser, HOC trả về propuser. Nếu dùng cả 2 -> Xung đột tên. - Wrapper Hell:
withAuth(withLayout(withTheme(Component))). Cây DOM sâu hoắm.
Kết luận
Đừng lạm dụng HOC cho logic chia sẻ state (hãy dùng Hooks). Chỉ dùng HOC cho các Layer bao bọc (Wrapper Layers) như Security, Error Handling.