Skip to content

React Query como State Management

[!NOTE] Leituras - https://tkdodo.eu/blog/react-query-as-a-state-manager - https://dev.to/juandj/using-react-query-to-solve-state-management-in-your-react-app-4kf9

  • O React Query não é uma biblioteca de data fetching
  • São poucas as features que são ligadas a networking

React Query é um gerenciador de estados assíncrono

  • O React Query mantém os dados que são server-side armazenados, enquanto os outros dados podem ser armazenados com useContext
    • Geralmente os dados armazenados direto no frontend são dados como a modal está aberta?
    • Manter os 2 tipos de dados faz muito sentido nesses casos
  • A QueryKey identifica sua query e se você chamar ela em dois locais diferentes, ele vai te trazer os mesmos dados
  • Isso pode ser abstraído em um hook, como no exemplo abaixo:
export const useTodos = () => useQuery(['todos'], fetchTodos)

function ComponentOne() {
  const { data } = useTodos()
}

function ComponentTwo() {
  // ✅ will get exactly the same data as ComponentOne
  const { data } = useTodos()
}

const queryClient = new QueryClient()

function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <ComponentOne />
      <ComponentTwo />
    </QueryClientProvider>
  )
}

Deduplicação de dados

  • Deduplicar é uma técnica para eliminar cópias de dados repetidos
  • React Query faz a deduplicação das chamadas de API que acontecem ao mesmo tempo

Cache

  • O React Query cacheia os resultados para você, dessa forma ele não precisa ficar chamando o endpoint a todo momento
  • Enquando o frontend exibe um resultado cacheado, o React Query revalida esses dados novamente para ver se o backend não atualizou ele

Gatilhos para refetch

  • refetchOnMount
  • refetchOnWindowFocus
  • refetchOnReconnect
  • Invalidação manual: queryClient.invalidateQueries

Evitando refresh desnecessário

  • Padrões de comportamento: https://tanstack.com/query/v4/docs/guides/important-defaults
  • Geralmente esses padrões funcionam bem, mas podemos subescrevê-los
  • Você pode desabilitar gatilhos como o refetchOnMount
  • Ou pode usar o staleTime:
    • O padrão é que assim que é feita a chamada dos dados, eles são considerados stale ou desatualizados
    • Configurando o staleTime você pode definir um tempo maior para considerar os dados como desatualizados e diminuir as chamadas do endpoint

Resultado e tipos de erros

Quando você usa um hook de useQuery, o React Query te permite prover os tipos de resultado e erro.

Exemplo:

const useGetUsers = () => {
   return useQuery<User[], Error>('users', fetchUsers)
}