đ āĻāĻžāϞ⧠āϞāĻžāĻāĻžāϰ āĻāϰāĻ āĻāĻāĻāĻŋ utility: React Query
React Query use āĻāϰāϞ⧠API fetch, cache, update āϏāĻŦ āϏāĻšāĻāĨ¤ RTK Query āĻ āĻŋāĻ āĻāĻā§, āĻāĻŋāύā§āϤ⧠complex scenario-āĻ clumsy āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
đ API Fetching āϏāĻšāĻ
const { data, isLoading, error } = useQuery(['todos'], fetchTodos)
āĻļā§āϧ⧠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
})
Flicker āĻāĻŽāĻžāϝāĻŧ, pagination smoothāĨ¤
RTK Query: Requires more manual work than React Query.
đ Updating & Mutations
const mutation = useMutation(updateTodo, {
onSuccess: () => queryClient.invalidateQueries(['todos'])
})
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 }
)
āĻāĻāϏāĻžāĻĨā§ 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 āĻāĻāϝāĻŧā§āĻ
})
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)
}
})
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 }
)
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 đ.
Top comments (0)