useFetch, um Hook React customizado

Artigo

21 de março de 2024

Fazer requisições HTTP em aplicações React é uma tarefa comum, mas nem sempre simples. Com tantas opções disponíveis, como Axios e Fetch, escolher a abordagem certa pode ser desafiador. Para simplificar esse processo, apresento o Hook React customizado useFetch, uma solução elegante para lidar com requisições HTTP de forma simples e reutilizável nos seus projetos.

Gerenciamento de estado:

Para começar nosso Hook, criamos estados para controlar o carregamento dos dados e possíveis erros. Usando o useState do React, definimos os estados data, isLoading e error.

const [data, setData] = useState();
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<Error | undefined>();

O estado data:

O estado data armazena os dados recebidos da API. Ele é inicializado como undefined e atualizado quando a requisição é bem-sucedida. Você também pode inicializar data com um valor padrão se quiser. Além disso, pode definir o tipo esperado para data.

O estado isLoading:

isLoading é um booleano que indica se a requisição está em andamento. Ele começa como false, muda para true durante a requisição e volta para false quando ela termina.

O estado error:

O estado error armazena possíveis erros que podem ocorrer durante a requisição. Ele é inicializado como undefined e atualizado com um objeto Error caso aconteça algum erro.

A função fetchData:

A função fetchData é responsável por fazer a requisição para a API. Ela é uma função assíncrona que usa o método fetch do JavaScript. No bloco try, fazemos a requisição e convertemos a resposta para um objeto JSON. Quaisquer erros são capturados no bloco catch e armazenados no estado error. Por fim, o estado isLoading é atualizado para false no bloco finally.

async function fetchData() {
  setIsLoading(true);
  try {
    const response = await fetch(url).then((res) => res.json());
    setData(response);
  } catch (error) {
    setError(error as Error);
  } finally {
    setIsLoading(false);
  }
}

Usando useEffect:

Para fazer a requisição para a API, usamos o useEffect do React. Passamos a função fetchData como primeiro argumento e a dependência url como segundo argumento. Isso garante que a requisição seja feita sempre que a url mudar.

useEffect(() => {
  fetchData();
}, [url]);

A função refetch:

A função refetch é uma forma de refazer a requisição para a API manualmente. Ela é chamada quando queremos atualizar os dados, por exemplo quando o usuário clica em um botão de recarregar.

function refetch() {
  setIsLoading(true);
  fetchData();
}

Código completo

Aqui está o código completo do nosso Hook React customizado useFetch:

import { useEffect, useState } from 'react';

export default function useFetch(url: string) {
  const [data, setData] = useState();
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState<Error | undefined>();

  async function fetchData() {
    setIsLoading(true);
    try {
      const response = await fetch(url).then((res) => res.json());
      setData(response);
    } catch (error) {
      setError(error as Error);
    } finally {
      setIsLoading(false);
    }
  }

  useEffect(() => {
    fetchData();
  }, [url]);

  function refetch() {
    setIsLoading(true);
    fetchData();
  }

  return { data, isLoading, error, refetch };
}

Usando o Hook

Agora que o Hook está pronto, você pode usá-lo em qualquer componente da sua aplicação para fazer requisições para a API. Basta importar o Hook e chamar a função useFetch, passando a url da API como argumento.

import useFetch from './useFetch';

export default function List() {
  const { data, isLoading, error, refetch } = useFetch("YOUR_API_URL");

  if (isLoading) {
    return <p>Loading...</p>;
  }

  if (error) {
    return <p>Error: {error.message}</p>;
  }

  return (
    // Render your list with the received data
  );
}

Retorno do Hook

Por fim, retornamos um objeto contendo os estados data, isLoading e error, junto da função refetch. Isso nos permite usar esse Hook em diferentes partes da aplicação para fazer requisições de forma simples e reutilizável.

Conclusão

O Hook React customizado useFetch simplifica o processo de fazer requisições HTTP em aplicações React. Com uma estrutura clara e funcionalidades bem definidas, ele permite um desenvolvimento mais eficiente e organizado. Experimente o useFetch no seu próximo projeto e veja como ele pode facilitar bastante a sua vida!

Espero que este artigo tenha sido útil para você. Se tiver dúvidas ou sugestões, não hesite em entrar em contato. Obrigado por ler até aqui e até a próxima! 🚀