0Pricing
React Academy · Aula

Refatorando um HOC para um hook personalizado

Converta passo a passo um HOC withAuth em um hook useAuth.

Refatorando um HOC para um hook personalizado é uma aula grátis de React Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.

Boas-vindas

Nesta lição, você refatorará passo a passo um HOC withAuth em um gancho personalizado useAuth, vendo exatamente por que a versão com gancho é mais limpa e fácil de testar.

O HOC withAuth (ponto de partida)

O HOC recebe um componente, verifica se o usuário está autenticado e redireciona para /login caso não esteja. Ele injeta o usuário como uma propriedade.
function withAuth(Component) {
  return function AuthGuard(props) {
    const { user, loading } = useAuthState();
    if (loading) return <Spinner />;
    if (!user) return <Navigate to="/login" />;
    return <Component {...props} user={user} />;
  };
}

const ProtectedPage = withAuth(MyPage);

Problemas com o HOC

O HOC: (1) adiciona um componente envolvente no DevTools, (2) injeta implicitamente a propriedade `user` — o componente precisa saber que deve esperá-la, (3) é difícil de testar sem renderizar todo o componente envolvente do HOC, (4) não é facilmente componível com outros ganchos.

Etapa 1: extraia a lógica para um gancho

Mova toda a lógica do HOC para um gancho personalizado. O gancho retorna diretamente o estado de autenticação — sem componente envolvente e sem injeção de propriedades.
function useAuth() {
  const { user, loading } = useAuthState();
  return { user, loading, isAuthenticated: !!user };
}

Etapa 2: trate os redirecionamentos no gancho

Mova a lógica de redirecionamento para um gancho separado (por exemplo, useRequireAuth) que chama navigate internamente e retorna o usuário.
function useRequireAuth(redirectTo = '/login') {
  const { user, loading } = useAuth();
  const navigate = useNavigate();

  useEffect(() => {
    if (!loading && !user) navigate(redirectTo);
  }, [user, loading, navigate, redirectTo]);

  return { user, loading };
}

Etapa 3: atualize o componente

Substitua o componente envolvente do HOC por uma chamada direta ao gancho dentro do componente. O componente chama useRequireAuth explicitamente e trata o carregamento. Agora, sua dependência está visível.
function MyPage() {
  const { user, loading } = useRequireAuth();
  if (loading) return <Spinner />;
  return <p>Hello, {user.name}</p>;
}

Comparando os benefícios

A versão com gancho oferece: (1) nenhum componente envolvente extra no DevTools, (2) uma dependência explícita — você vê `useRequireAuth` no componente, (3) facilidade de teste por meio da simulação do gancho, (4) facilidade de composição com outros ganchos no mesmo componente.

Testando a versão com gancho

Simule useRequireAuth no seu teste substituindo a exportação do módulo. O teste do componente só precisa renderizar o componente e verificar a saída — não é necessária nenhuma configuração de HOC.
vi.mock('./useRequireAuth', () => ({
  useRequireAuth: () => ({ user: mockUser, loading: false })
}));

render(<MyPage />);
expect(screen.getByText('Hello, Alice')).toBeInTheDocument();

Quando manter um HOC

Mantenha o HOC se precisar proteger muitos componentes de forma declarativa (por exemplo, em definições de rotas) e não quiser adicionar a chamada do gancho a cada um deles. Você pode até criar o HOC SOBRE o gancho.
function withAuth(Component) {
  return function (props) {
    const { user, loading } = useRequireAuth();
    if (loading) return <Spinner />;
    return <Component {...props} user={user} />;
  };
}

O melhor dos dois mundos

A arquitetura final: um gancho useRequireAuth para uso direto nos componentes E um HOC withAuth simples, criado sobre ele, para proteção declarativa de rotas. Ambos compartilham a mesma lógica do gancho.

Verificação rápida

Qual é o principal benefício de chamar useRequireAuth dentro de um componente em vez de envolvê-lo com um HOC withAuth?

Recapitulação

Refatore HOCs para ganchos extraindo a lógica para um gancho personalizado, movendo efeitos colaterais (como redirecionamentos) para o gancho e chamando o gancho diretamente no componente. Crie um HOC simples sobre o gancho quando for necessário um envolvimento declarativo.

Curso concluído

Parabéns! Você concluiu **Padrões do React: propriedades de renderização e HOCs**. Agora você entende os dois padrões clássicos, suas vantagens e desvantagens e como refatorá-los para ganchos personalizados modernos.

Perguntas Frequentes

A aula “Refatorando um HOC para um hook personalizado” é grátis?

Sim — o texto completo de “Refatorando um HOC para um hook personalizado” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.

O que vou aprender em “Refatorando um HOC para um hook personalizado”?

Converta passo a passo um HOC withAuth em um hook useAuth. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar React Academy?

Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Refatorando um HOC para um hook personalizado”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de React Academy?

Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Padrão de propriedades de renderização
  2. Componentes de ordem superior (HOCs) explicados
  3. HOC vs propriedades de renderização vs hooks personalizados
  4. Refatorando um HOC para um hook personalizado
← Voltar para React Academy