šÆ Best Practice Menggunakan @tanstack/react-query

I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.
Search for a command to run...

I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.
No comments yet. Be the first to comment.
Ringkasan: Jika OpenClaw adalah AI Operating System yang menghubungkan berbagai layanan dan agent, maka Hermes adalah AI Worker yang fokus mengerjakan pekerjaan, belajar dari pengalaman, dan semakin p

Ketika membangun aplikasi modern seperti Next.js, Cloudflare Workers, platform AI, microservices, atau real-time dashboard, ada banyak istilah jaringan yang sering muncul: TCP, UDP, HTTP/2, QUIC, WebS

Setiap tahun, ribuan mahasiswa jurusan Teknologi Informasi, Sistem Informasi, dan Teknik Informatika diwisuda. Namun, tidak sedikit di antara mereka yang kemudian menghadapi kenyataan yang cukup berat

Jika Anda menggunakan Next.js, kemungkinan besar Anda pernah mendengar anggapan bahwa: "Next.js = Vercel" Padahal kenyataannya tidak harus demikian. Di sinilah OpenNext hadir. OpenNext adalah proyek

Saat pertama kali mencoba OpenCode Go, saya hampir langsung berlangganan tanpa membaca detail program yang mereka sediakan. Untungnya saya menemukan bahwa OpenCode memiliki program referral yang membe

Meningkatkan Kualitas Data Fetching di Aplikasi Modern
Di ekosistem React modern, mengelola data serverāfetching, caching, synchronizing, dan state managementāsering menjadi tantangan. Banyak developer masih memakai pendekatan manual seperti useEffect + fetch, yang rawan menyebabkan:
Request ganda yang tidak perlu
Loading state yang berantakan
Race condition
Cache yang tidak sinkron ketika data berubah
Kompleksitas logic untuk polling, retry, dan refetch
React Query hadir sebagai solusi battle-tested untuk membuat data fetching menjadi declarative, predictable, dan scalable.
Artikel ini membahas praktik terbaik (best practice) agar penggunaan React Query di proyek Anda rapi, efisien, dan maintainable.
React Query fokus pada server state, bukan data UI.
Server state berubah di luar kontrol aplikasi (misal: ada user lain update data).
Server state tidak boleh kamu rawat manual dengan useState/useEffect.
React Query memberi:
Caching otomatis
Stale-while-revalidate
Background refresh
Retry otomatis
Refetch otomatis saat window fokus
Garbage collection data lama
Optimistic update
Filosofi dasarnya:
Jangan bawa urusan server ke state management manual. Delegasikan ke React Query.
queryKey Berbentuk Array (Best Practice Mutlak)Kenapa harus array?
ā Struktur terprediksi
ā Mendukung nested keys
ā Mudah di-compute
ā Stabil untuk caching
ā Membedakan query berdasarkan parameter
Contoh:
useQuery({
queryKey: ['users'],
queryFn: getUsers
})
useQuery({
queryKey: ['users', userId],
queryFn: () => getUserById(userId)
})
Array membuat React Query dapat:
Memahami konteks query
Meng-cache data berdasarkan struktur key
Melakukan invalidasi granular
useMutation (Bukan useQuery)Best practice yang sangat penting:
| Jenis Operasi | Hook yang dipakai | Alasan |
| GET (fetch) | useQuery | Data bisa dicache |
| POST/PUT/DELETE (mutate) | useMutation | Tidak dicache, sifatnya side effect |
Kenapa tidak memakai useQuery untuk POST?
Karena POST tidak bersifat idempotent, dan React Query bisa:
memicu refetch otomatis
menyimpan hasil POST ke cache secara tidak wajar
menganggap POST sebagai ādata stateā
useMutation mendesain operasi mutate sebagai action, bukan state.
Best practice:
const mutation = useMutation({
mutationFn: updateUser,
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['users'] })
}
})
Kadang data berubah di server, tapi Anda tidak bisa memanggil invalidateQueries. Misal:
Data berubah karena user lain
Data berubah oleh sistem background
Data dikirim via WebSocket
Server melakukan push update (SSE)
Best practice React Query:
refetchIntervalPolling otomatis:
useQuery({
queryKey: ['notifications'],
queryFn: getNotifications,
refetchInterval: 5000 // setiap 5 detik
})
ā Jika halaman tidak terbuka apakah refetch tetap berjalan?
Tidak. React Query pause saat tab tidak aktif menggunakandocument.visibilityState.
queryClient.setQueryDataSaat server push data:
socket.on('new_message', message => {
queryClient.setQueryData(['messages'], old => [...old, message])
})
Integrasi mudah seperti WebSocket.
setQueryDataJika update datang dari sumber lain.
select untuk Transformasi Data di QueryDaripada transform data di component (boros render), lakukan di query:
useQuery({
queryKey: ['products'],
queryFn: getProducts,
select: data => data.map(p => ({ ...p, price: p.price / 100 }))
})
Keuntungan:
Component tetap ringan
Transformasi terjadi sekali
Konsisten
Default React Query sangat agresif karena diasumsikan untuk data yang sering berubah.
Best practice:
staleTime: Infinity
staleTime: 1000 * 60 * 5 // 5 menit
staleTime: 1000 * 30 // 30 detik
Untuk UI yang responsif:
useMutation({
mutationFn: updateTodo,
onMutate: async newTodo => {
await queryClient.cancelQueries(['todos'])
const prev = queryClient.getQueryData(['todos'])
queryClient.setQueryData(['todos'], old =>
old.map(t => t.id === newTodo.id ? newTodo : t)
)
return { prev }
},
onError: (_err, _newTodo, ctx) => {
queryClient.setQueryData(['todos'], ctx.prev)
},
onSettled: () => {
queryClient.invalidateQueries(['todos'])
}
})
Buat file:
/src/lib/react-query-key.tsexport const queryKeys = {
users: () => ['users'] as const,
user: (id: string) => ['users', id] as const,
products: () => ['products'] as const,
}
Ini mencegah typo dan membuat invalidasi lebih aman.
Jangan gunakan refetchInterval untuk semua data.
Pertanyaan utama:
Apakah data sering berubah?
Apakah perubahan harus tampil real-time?
Apakah polling terlalu mahal?
Jika tidak perlu ā hilangkan polling.
const queryClient = new QueryClient({
defaultOptions: {
queries: {
retry: 2,
refetchOnWindowFocus: true,
refetchOnReconnect: true,
staleTime: 1000 * 60, // 1 menit
}
}
})
Global config ini memastikan aplikasi tetap efisien tanpa pengaturan manual di setiap query.
Menggunakan React Query dengan best practice:
menghilangkan boilerplate
mencegah bug server state
membuat aplikasi scalable
cache bekerja otomatis
UI terasa lebih cepat dan mulus
logic lebih bersih dan terstruktur
memudahkan debugging & performance tracing
React Query bukan sekadar ādata fetching libraryā.
Ia adalah server state ecosystem yang menyelesaikan masalah mendasar yang tidak bisa diselesaikan oleh React state biasa.
Jika digunakan dengan benarādengan queryKey yang konsisten, strategi pada mutation, invalidasi yang tepat, dan manajemen stale timeāReact Query menjadi tulang punggung arsitektur front-end modern.