Una solución muy popular para esto es usar una librería de "server state" como React Query (ahora TanStack Query) o SWR. Estas librerías se encargan de todo el ciclo de vida de la petición por ti: fetching, caching, re-fetching en segundo plano, y te dan hooks que ya incluyen los estados de isLoading, isError, data, etc.
Te simplifica el código una barbaridad y te da un montón de funcionalidades extra de rendimiento de forma gratuita.