Написать кастомный хук useFetch(url), который возвращает { data, loading, error }. При смене url или размонтировании предыдущий запрос должен отменяться, чтобы не было гонок и обновления state после размонтирования.
Пример
function UserCard({ userId }) { const { data, loading, error } = useFetch(`/api/users/${userId}`); if (loading) return <p>Loading…</p>; if (error) return <p>Error: {error.message}</p>; return <p>{data.name}</p>;}