Selama dua tahun pertama pakai React, pola fetching data saya selalu sama: useState buat nyimpen data, useEffect buat manggil API, satu state lagi buat loading. Kelihatan simpel, dan di tutorial mana pun begitu contohnya.

Masalahnya mulai kerasa waktu aplikasinya tumbuh. Race condition muncul saat user pindah halaman cepat-cepat — response request lama datang belakangan dan menimpa data yang baru. Terus ada masalah refetch: data basi kalau user balik ke halaman yang sama, tapi kalau selalu refetch, jaringan boros.

Titik baliknya waktu saya ngabisin satu hari penuh debugging bug yang ternyata klasik: lupa cleanup function di useEffect, jadi komponen yang sudah unmount masih coba setState. Setelah itu saya coba React Query — dan sebagian besar kode fetching saya hilang, diganti satu hook yang sudah mikirin caching, deduplication, dan refetch otomatis.

Pelajarannya bukan 'useEffect itu jelek'. Pelajarannya: fetching data itu masalah yang kelihatan simpel tapi punya banyak edge case, dan edge case itu sudah diselesaikan orang lain dengan lebih baik dari yang bisa saya tulis sendiri di tiap proyek.