Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introdução a React Query

Introdução a React Query

O React Query é uma das "ferramentas do momento" no ecossistema React que promete lidar com data fetching de forma simples e prática. Ele permite fazer o fetching de dados, adicionar dados no cache, gerenciar invalidação de cache, lógicas de retry entre outras funcionalidades úteis de forma fácil, sem necessidade de lidar com lógicas complexas ou "tocar no estado global". Conheça o React Query e mude a forma como você lida com o gerenciamento de estados do servidor.

Marcel dos Santos

June 17, 2021
Tweet

More Decks by Marcel dos Santos

Other Decks in Programming

Transcript

  1. Interaja nas mídias sociais!
 
 - fale sobre o evento,

    palestrantes e conteúdo - tire fotos do evento e publique
 - interaja com outros participantes do evento - tire dúvidas ou dê feedbacks para os palestrantes
  2. 1. seguir @marcelgsantos no Twitter
 2. tuitar utilizando as hashtags

    #ReactQuery e #TheDevConf e me marcar no tweet
 3. não vale tuíte em branco
 4. não vale retuíte Concorra a um livro da Casa do Código! 🤩
  3. o React Query é uma biblioteca utilizada para data fetching

    para o React criada por Tanner Linsley
  4. porém, o React Query não lida apenas com data fetching

    mas também com cache, sincronização e atualização do server state
  5. a maioria das bibliotecas tradicionais de gerenciamento de estados são

    boas para lidar com client state e não server state
  6. características do server state:
 
 - persistência remota e falta

    de controle
 - requer uma API assíncrona para fetching e updating
 - possui propriedade compartilhada
 - pode ficar desatualizado rápido
  7. outras tarefas complicadas ao lidar com server state:
 
 -

    cache
 - atualizar dados desatualizados 
 - performance
 - lazy loading
  8. ele trará algumas vantagens como: - tornar a aplicação mais

    limpa e fácil de ler
 - impacto positivo na experiência do usuário
  9. o React Query possui uma dev tools dedi- cada para

    auxiliar no debug da aplicação
  10. uma query é uma referência para uma fonte de dados

    assíncrona que é associada a uma chave única
  11. ela pode ser utilizada com métodos baseados em promises para

    fazer o 
 fetch de dados de um servidor
  12. import { useQuery } from "react-query"; function App() { const

    result = useQuery("todos", fetchTodoList); }
  13. a flag isLoading informa o estado do fetching pode ser

    utilizada para mostrar um spinner durante o carregamento
  14. as flags isError e isSuccess informam o estado da conclusão

    da requisição e pode ser utilizadas para mostrar um feedback de erro ou os dados retornados
  15. os dados de retorno e os dados de erro ficam

    disponíveis em data e error
  16. function Todos() { const { isLoading, isError, data, error }

    = useQuery('todos', fetchTodos) if (isLoading) { return <span>Loading""..."</span> } if (isError) { return <span>Error: {error.message}"</span> } return ( <ul> {data.map(todo "=> ( <li key={todo.id}>{todo.title}"</li> ))} "</ul> ) }
  17. uma query key deve ser única e pode ser uma

    string simples ou um objeto complexo desde que possa ser serializado
  18. "// uma lista de tarefas useQuery('todos', ""...) "// uma tarefa

    específica useQuery(['todo', 5], ""...) "// uma lista de tarefas no estado 'done' useQuery(['todos', { type: 'done' }], ""...)
  19. const { error } = useQuery(['todos', todoId], async () "=>

    { if (somethingGoesWrong) { throw new Error('Oh no!') } return data })
  20. function App () { "// The following queries will execute

    in parallel const usersQuery = useQuery('users', fetchUsers) const teamsQuery = useQuery('teams', fetchTeams) const projectsQuery = useQuery('projects', fetchProjects) "// ""... }
  21. quando uma consulta falha, o React Query fará o retry

    automaticamente até atingir o número máximo de retries
  22. import { useQuery } from 'react-query' "// Make a specific

    query retry a certain number of times const result = useQuery(['todos', 1], fetchTodoListPage, { retry: 10, })
  23. as mutations são utilizadas para criar, alterar ou remover um

    recurso no server-side e utiliza-se o hook useMutation
  24. function App() { const mutation = useMutation(newTodo !=> axios.post('/todos', newTodo))

    return ( <div> {mutation.isLoading ? ( 'Adding todo!!...' ) : ( !<> {mutation.isError ? ( <div>An error occurred: {mutation.error.message}!</div> ) : null} {mutation.isSuccess ? <div>Todo added!!</div> : null} <button onClick={() !=> { mutation.mutate({ id: new Date(), title: 'Do Laundry' }) }} > Create Todo !</button> !!</> )} !</div> ) }
  25. useMutation(addTodo, { onMutate: variables "=> { "// a mutation is

    about to happen! return { id: 1 } }, onError: (error, variables, context) "=> { "// an error happened! console.log(`rolling back optimistic update with id ${context.id}`) }, onSuccess: (data, variables, context) "=> { "// success }, onSettled: (data, error, variables, context) "=> { "// error or success }, })
  26. o React Query permite invalidar uma query quando algo ocorrer

    para marcá-la como stale e ocasionar um refetch
  27. quando refetch acontece, o componente que utiliza a query será

    renderizado novamente com os dados atualizados
  28. import { useQuery, useQueryClient } from 'react-query' const queryClient =

    useQueryClient() queryClient.invalidateQueries('todos') "// both queries below will be invalidated const todoListQuery = useQuery('todos', fetchTodoList) const todoListQuery = useQuery(['todos', { page: 1 }], fetchTodoList)
  29. queryClient.invalidateQueries(['todos', { type: 'done' }]) "// the query below will

    be invalidated const todoListQuery = useQuery(['todos', { type: 'done' }], fetchTodoList) "// however, the following query below will NOT be invalidated const todoListQuery = useQuery('todos', fetchTodoList)
  30. o React Query é um biblioteca que facilita o gerenciamento

    do server state de forma simples, limpa e cheia de funcionalidades
  31. nada de ficar batendo cabeça com as complexidades do Redux

    e tendo problemas com gerenciamento de estado