DEV Community

Cover image for I state "You will love it - React Query".
Golam Mostafa
Golam Mostafa

Posted on

I state "You will love it - React Query".

🚀 āĻ­āĻžāϞ⧋ āϞāĻžāĻ—āĻžāϰ āφāϰāĻ“ āĻāĻ•āϟāĻŋ utility: React Query

React Query use āĻ•āϰāϞ⧇ API fetch, cache, update āϏāĻŦ āϏāĻšāϜāĨ¤ RTK Query āĻ āĻŋāĻ• āφāϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ complex scenario-āĻ clumsy āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤


👉 API Fetching āϏāĻšāϜ

const { data, isLoading, error } = useQuery(['todos'], fetchTodos)
Enter fullscreen mode Exit fullscreen mode

āĻļ⧁āϧ⧁ useQuery āĻŦāĻž useMutation call āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤
Background-āĻ fetch, retry, error handling autoāĨ¤

RTK Query: Multiple queries āĻŦāĻž complex retry verboseāĨ¤


👉 Caching & Stale Data

const { data } = useQuery(['projects', page], fetchProjects, {
  staleTime: 5000,
  keepPreviousData: true
})
Enter fullscreen mode Exit fullscreen mode

Flicker āĻ•āĻŽāĻžāϝāĻŧ, pagination smoothāĨ¤

RTK Query: Requires more manual work than React Query.


👉 Updating & Mutations

const mutation = useMutation(updateTodo, {
  onSuccess: () => queryClient.invalidateQueries(['todos'])
})
Enter fullscreen mode Exit fullscreen mode

onSuccess, onError, onSettled āĻĻāĻŋāϝāĻŧ⧇ cache automatically invalidateāĨ¤

RTK Query: Tag system use āĻ•āϰāϤ⧇ āĻšāϝāĻŧ, āĻāĻ•āϟ⧁ verboseāĨ¤


👉 Offline / Window Focus Handling

  • refetchOnWindowFocus → user active āĻ•āϰāϞ⧇ fresh dataāĨ¤
  • Retry automatically network fail āĻšāϞ⧇āĨ¤

RTK Query: Manual setup āĻĻāϰāĻ•āĻžāϰāĨ¤


👉 File Uploads & Non-serializable Data

React Query supports File, FormData direct useāĨ¤

RTK Query: ❌ serializable restriction → trickyāĨ¤ Cache Redux store-āĻ → File, FormData, Date support āύ⧇āχāĨ¤


👉 Multiple Queries & Dependent Queries

const { data: user } = useQuery(['user', userId], getUser)
const { data: projects } = useQuery(
  ['projects', user?.id],
  getProjects,
  { enabled: !!user?.id }
)
Enter fullscreen mode Exit fullscreen mode

āĻāĻ•āϏāĻžāĻĨ⧇ multiple query handle āĻ•āϰāĻž āϏāĻšāϜāĨ¤

RTK Query: conditional skip āĻ•āϰāϤ⧇ āĻšāϝāĻŧ → āĻ•āĻŽ intuitiveāĨ¤


👉 API Error Handling & Conditional Invalidate

useMutation(updateData, {
  onSuccess: () => queryClient.invalidateQueries(['todos']),
  onSettled: () => queryClient.invalidateQueries(['todos']) // success/error āωāĻ­āϝāĻŧ⧇āχ
})
Enter fullscreen mode Exit fullscreen mode

Default: error āĻšāϞ⧇ invalidate āĻšāϝāĻŧ āύāĻžāĨ¤ āϚāĻžāχāϞ⧇ onSettled use āĻ•āϰ⧇ success āĻŦāĻž error āωāĻ­āϝāĻŧ⧇āχ invalidate āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤

RTK Query: conditional invalidate āĻ•āϰāϤ⧇ extra code āϞāĻžāϗ⧇ → beginner-unfriendlyāĨ¤


👉 Optimistic Updates

useMutation(updateTodo, {
  onMutate: async (newTodo) => {
    await queryClient.cancelQueries(['todos'])
    const previousTodos = queryClient.getQueryData(['todos'])
    queryClient.setQueryData(['todos'], old => [...old, newTodo])
    return { previousTodos }
  },
  onError: (err, newTodo, context) => {
    queryClient.setQueryData(['todos'], context.previousTodos)
  }
})
Enter fullscreen mode Exit fullscreen mode

UI instantly update, error āĻšāϞ⧇ rollbackāĨ¤

RTK Query: onQueryStarted + updateQueryData → more complexāĨ¤


👉 Infinite Queries (Infinite Scroll)

const { data, fetchNextPage, hasNextPage } = useInfiniteQuery(
  ['projects'],
  fetchProjects,
  { getNextPageParam: (lastPage) => lastPage.nextCursor }
)
Enter fullscreen mode Exit fullscreen mode

Next page automatic trackāĨ¤

RTK Query: Manual setup āĻŦāĻž complex patternāĨ¤


⭐ Awesome Devtools

React Query devtools āĻĻāĻŋāϝāĻŧ⧇ āϏāĻŦ status (fetching, stale, active, etc.) āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤ Debugging āĻ…āύ⧇āĻ• āϏāĻšāϜāĨ¤


💡 Conclusion:
I have used both RTK and React Query. But find that React Query is much simpler than RTK 😊.

DOCUMENTATION

Top comments (0)