useFetch Pattern O Hook Personalizado useFetch

Última atualização: 2026-11-03

useFetch Pattern O Hook Personalizado useFetch

Extraia a lógica de requisição de três estados para um Hook personalizado useFetch(url): um componente chama uma linha e obtém { data, loading, error }, então o estado da requisição não se espalha mais pelo código. Este é o caso clássico de reutilização de lógica e o degrau para o TanStack Query. Todo componente compartilha o mesmo comportamento bem testado, e a limpeza fica em um só lugar em vez de ser copiada.

GrupoDados e Engenharia
TipoPadrão

ℹ️ Informação O editor transpila JSX para JavaScript e renderiza a UI real na sandbox; os componentes são montados automaticamente — sem render manual.

📝 Sintaxe

function useFetch(url) {
  const [state, setState] = useState({ data: null, loading: true, error: null })
  useEffect(() => {
    const ctrl = new AbortController()      // cancel the old request when url changes or on unmount
    setState({ data: null, loading: true, error: null })
    fetch(url, { signal: ctrl.signal })
      .then(r => r.ok ? r.json() : Promise.reject(new Error('HTTP ' + r.status)))
      .then(data => setState({ data, loading: false, error: null }))
      .catch(err => err.name !== 'AbortError' &&
        setState({ data: null, loading: false, error: err }))
    return () => ctrl.abort()               // cleanup: stops a stale response from overwriting fresh data
  }, [url])
  return state
}

⚙️ Parâmetros

urlO endereço da requisição; ele atua como uma dependência, então quando url muda o Hook refaz a busca automaticamente e cancela a requisição anterior.

Retorna:Sem valor de retorno; trata-se de um padrão de codificação, não de uma API chamável.

▶ Exemplo

O exemplo roda direto: renderiza automaticamente ao expandir e edições valem na hora.

Saída:

Clicar em "Trocar para #2" dispara uma nova requisição, mostra o estado de carregamento por um instante e então renderiza o todo correspondente — o componente escreve uma única linha useFetch(url) enquanto toda a lógica de três estados é reutilizada.

💡 Pontos-chave

💡 Dica Adicione uma função refetch e um cache Map no nível do módulo à versão avançada e você estará perto do embrião do TanStack Query (veja a próxima seção).
⚠️ Aviso Ao trocar rapidamente, a requisição antiga pode voltar por último e sobrescrever os novos dados: você deve abortá-la ou, como no exemplo, descartar a resposta obsoleta com uma flag alive.
ℹ️ Informação Um Hook personalizado deve começar o nome com use; caso contrário, pode não chamar outros Hooks legalmente e as regras de lint reclamarão.
Mais casos em breve.

📚 Tutoriais Relacionados

❓ Perguntas Frequentes

P setState após desmontar gera aviso?
R O React 18 não avisa mais, mas a escrita ainda é desperdiçada e pode chegar fora de ordem; manter a limpeza abort ou alive continua sendo boa prática.
P Como suporto POST?
R Passe o método e o corpo como argumentos para useFetch(url, options), ou envolva um Hook estilo mutation separado para operações de escrita.
P Dois componentes com a mesma url disparam duas requisições?
R Sim. O estado de um Hook pertence ao ponto de chamada e não é compartilhado; para um cache compartilhado, use TanStack Query ou construa um cache no nível do módulo você mesmo.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%