typescriptintermediate

usePrefetch Hook

Prefetches data or resources when the user hovers over an element to reduce perceived latency.

typescript
import { useRef, useCallback, MouseEvent } from 'react';

const prefetchCache = new Set<string>();

export function usePrefetch(fetchFn: () => Promise<unknown>) {
  const hasTriggered = useRef(false);

  const onMouseEnter = useCallback((e: MouseEvent) => {
    const key = (e.currentTarget as HTMLElement).dataset.prefetchKey || '';
    if (hasTriggered.current || prefetchCache.has(key)) return;
    hasTriggered.current = true;
    prefetchCache.add(key);
    fetchFn().catch(() => {
      prefetchCache.delete(key);
      hasTriggered.current = false;
    });
  }, [fetchFn]);

  return { onMouseEnter };
}

// Usage:
// const prefetch = usePrefetch(() => fetch('/api/user/123'));
// <div {...prefetch} data-prefetch-key="user-123">Hover me</div>

Use Cases

  • Route prefetching
  • Data prefetching on hover

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.