A importância de se fazer Fetch de dados em React
Fazer o fetch de dados de uma API no React Hooks é importante por várias razões:
- Reutilização de código: Ao criar um hook personalizado para realizar solicitações de API, você pode reutilizar esse código em vários componentes da sua aplicação, o que é muito útil em aplicações de tamanho médio ou grande.
- Gerenciamento de estado centralizado: Ao usar hooks para gerenciar o estado da solicitação de API, você pode mantê-lo de forma centralizada e fácil de gerenciar, o que é útil quando a lógica de gerenciamento de estado é complexa.
- Melhor separação de preocupações: Ao fazer o fetch de uma API no hook, você pode se concentrar no que realmente importa – a lógica da sua aplicação – e deixar que o hook cuide dos detalhes da solicitação de API.
- Maior legibilidade do código: Ao usar hooks para gerenciar o estado da solicitação de API, o código fica mais claro e fácil de entender, pois a lógica de gerenciamento de estado é isolada em um único lugar.
Algumas formas de se fazer Fetch de dados em React
Uma forma de realizar o fetch de dados de uma API no React Hooks é utilizando o hook “useEffect” juntamente com o método “fetch”. Aqui está um exemplo de como isso pode ser feito:
import React, { useState, useEffect } from 'react'; const App = () => { const [data, setData] = useState(null); const [loading, setLoading] = useState(false); useEffect(() => { const fetchData = async () => { setLoading(true); const response = await fetch('https://api.example.com/data'); const json = await response.json(); setData(json); setLoading(false); }; fetchData(); }, []); return ( <div> {loading ? ( <div>Loading...</div> ) : ( data && <pre>{JSON.stringify(data, null, 2)}</pre> )} </div> ); }; export default App;
Neste exemplo, o hook “useEffect” é utilizado para realizar a chamada da API assíncrona quando o componente é montado pela primeira vez. A resposta da API é armazenada no estado “data” e o estado “loading” é usado para indicar se a solicitação de API está em andamento ou não.
Outra forma de realizar o fetch de dados de uma API no React Hooks é utilizando o hook “useState” e o “useReducer”. Aqui está um exemplo de como isso pode ser feito:
import React, { useState, useReducer } from 'react'; const dataFetchReducer = (state, action) => { switch (action.type) { case 'FETCH_INIT': return { ...state, isLoading: true, isError: false }; case 'FETCH_SUCCESS': return { ...state, isLoading: false, isError: false, data: action.payload }; case 'FETCH_FAILURE': return { ...state, isLoading: false, isError: true }; default: throw new Error(); } }; const useDataApi = (initialUrl, initialData) => { const [url, setUrl] = useState(initialUrl); const [state, dispatch] = useReducer(dataFetchReducer, { isLoading: false, isError: false, data: initialData, }); useEffect(() => { let didCancel = false; const fetchData = async () => { dispatch({ type: 'FETCH_INIT' }); try { const result = await axios(url); if (!didCancel) { dispatch({ type: 'FETCH_SUCCESS', payload: result.data }); } } catch (error) { if (!didCancel) { dispatch({ type: 'FETCH_FAILURE' }); } } }; fetchData(); return () => { didCancel = true; }; }, [url]); return [state, setUrl]; }; const App = () => { const [{ data, isLoading, isError }, doFetch] = useDataApi( 'https://api.example.com/data', null ); return ( <div> {isError && <div>Something went wrong ...</div>} {isLoading ? ( <div>Loading ...</div> ) : ( data && <pre>{JSON.stringify(data, null, 2)}</pre> )} <button onClick={() => doFetch('https://api.example.com/data')}> Fetch Data </button> </div> ); }; export default App;
Neste exemplo, o hook “useState” é utilizado para armazenar a URL da API e o “useReducer” é utilizado para gerenciar o estado do fetch dos dados da API. O estado inclui informações sobre se a solicitação está em andamento, se houve algum erro ou se os dados foram retornados com sucesso.
O dataFetchReducer
é um reducer que controla o estado da solicitação de dados da API. Ele é escrito como uma função que recebe o estado atual e uma ação, e retorna um novo estado baseado na ação.
As ações são objetos com uma propriedade type
que descreve a ação que está sendo realizada e, opcionalmente, uma propriedade payload
que carrega dados adicionais. No exemplo, as ações são:
FETCH_INIT
: Disparada quando a solicitação de dados começa. Atualiza o estado para indicar que a solicitação está em andamento.FETCH_SUCCESS
: Disparada quando a solicitação de dados é bem-sucedida. Atualiza o estado para incluir os dados retornados pela API.FETCH_FAILURE
: Disparada quando a solicitação de dados falha. Atualiza o estado para indicar que houve um erro.
O dataFetchReducer
atualiza o estado atual de acordo com a ação recebida. Ele é utilizado com o hook useReducer
para gerenciar o estado da solicitação de dados da API e para manter o estado gerenciado de forma centralizada em vez de espalhá-lo por todo o componente.
O useDataApi
é um hook customizado que combina o useReducer
e o useEffect
para realizar solicitações de API de forma fácil e gerenciável.
Ele recebe uma URL como entrada e retorna o estado atual da solicitação de API, bem como uma função que pode ser usada para iniciar a solicitação.
Internamente, o hook usa o useReducer
com o dataFetchReducer
para gerenciar o estado da solicitação de API. O useEffect
é usado para iniciar a solicitação de API quando a URL é atualizada.
O hook mantém o estado da solicitação de API gerenciado de forma centralizada e fornece uma interface fácil de usar para fazer solicitações de API no componente. Dessa forma, você pode se concentrar no que realmente importa – a lógica da sua aplicação – e deixar que o hook cuide dos detalhes da solicitação de API.
Aqui está outra forma de realizar o fetch de uma API usando o hook useState
:
import React, { useState, useEffect } from 'react'; const useDataApi = (initialUrl) => { const [data, setData] = useState(null); const [url, setUrl] = useState(initialUrl); const [isLoading, setIsLoading] = useState(false); const [isError, setIsError] = useState(false); useEffect(() => { const fetchData = async () => { setIsError(false); setIsLoading(true); try { const response = await fetch(url); const result = await response.json(); setData(result); } catch (error) { setIsError(true); } setIsLoading(false); }; fetchData(); }, [url]); return [{ data, isLoading, isError }, setUrl]; };
Neste exemplo, o hook useDataApi
retorna um array com o objeto de estado que inclui os dados retornados pela API, o estado de carregamento e o estado de erro. Ele também retorna uma função setUrl
que pode ser usada para atualizar a URL para a qual fazer o fetch.
O hook useEffect
é usado para disparar a solicitação de API quando a URL é atualizada. Dentro do useEffect
, uma função fetchData
é definida que realiza a solicitação de API usando o fetch
e atualiza o estado com o resultado.
Este exemplo ilustra como o hook useState
pode ser usado para gerenciar o estado da solicitação de API, mas é importante lembrar que esse tipo de gerenciamento de estado é mais fácil de fazer com o useReducer
quando a lógica de gerenciamento de estado é mais complexa.