Code Explainers
Code explainers tagged #custom-hooks
javascript
import { useState, useEffect, useCallback, useRef } from 'react'; const cache = new Map(); const inflight = new Map();
Building a stale-while-revalidate hook in React
caching
request-deduplication
custom-hooks
Advanced
10 steps
typescript
import { useEffect, useState } from "react"; interface Section { id: string;
Building a scroll-spy hook in React
custom-hooks
intersectionobserver
dom-observation
Intermediate
8 steps
javascript
import { useEffect, useRef, useState } from 'react'; export function useDelayedFlag(active, delay = 300) { const [visible, setVisible] = useState(false);
Delaying a loading spinner with a React hook
custom-hooks
debouncing
cleanup
Intermediate
8 steps
typescript
import { useCallback, useRef, useState } from "react"; type Tag = { id: string; label: string };
A debounced, abortable tag-input hook in React
custom-hooks
debounce
abort-controller
Advanced
10 steps
javascript
import { useEffect, useRef } from 'react'; export function useOnClickOutside(handler) { const ref = useRef(null);
A click-outside hook in React
custom-hooks
refs
event-listeners
Intermediate
7 steps
typescript
import { useState, useEffect, useRef, useCallback } from "react"; interface Suggestion { id: string;
A debounced autocomplete hook in React
debounce
custom-hooks
abortcontroller
Advanced
7 steps
javascript
import { useEffect, useRef } from 'react'; export function useRefetchOnFocus(refetch, { staleTime = 30_000 } = {}) { const lastFetchedAt = useRef(Date.now());
A React hook that refetches on tab focus
custom-hooks
refs
event-listeners
Intermediate
6 steps
typescript
import { useCallback, useEffect, useRef, useState } from "react"; interface UseResendCooldownOptions { cooldownSeconds?: number;
A resend cooldown hook in React
custom-hooks
timers
state-management
Intermediate
7 steps
javascript
import { useReducer, useEffect } from "react"; const initialState = { status: "idle", data: null, error: null };
Building a data-fetching hook in React
custom-hooks
usereducer
data-fetching
Intermediate
9 steps
javascript
import { useState, useEffect, useCallback } from 'react'; function getColumnCount(width) { if (width < 640) return 1;
A responsive column hook in React
custom-hooks
debouncing
responsive-design
Intermediate
7 steps
javascript
import { useEffect, useState } from 'react'; export function useJobStatus(jobId, { interval = 3000 } = {}) { const [status, setStatus] = useState('pending');
Polling a job status with a React hook
custom-hooks
polling
cleanup
Intermediate
8 steps
javascript
function useHashState(key, defaultValue) { const parse = () => { const params = new URLSearchParams(window.location.hash.slice(1)); return params.has(key) ? params.get(key) : defaultValue;
A React hook backed by the URL hash
custom-hooks
url-state
event-listeners
Intermediate
6 steps
typescript
import { useCallback, useEffect, useRef, useState } from "react"; interface Page<T> { items: T[];
A cursor-based infinite scroll hook in React
custom-hooks
pagination
intersection-observer
Intermediate
9 steps
javascript
import { useState, useEffect, useCallback } from 'react'; export function useCountdown(initialSeconds) { const [secondsLeft, setSecondsLeft] = useState(initialSeconds);
Building a useCountdown hook in React
custom-hooks
state-management
side-effects
Intermediate
8 steps
javascript
import { useEffect, useRef } from "react"; import { useBlocker } from "react-router-dom"; export function useUnsavedChangesPrompt(isDirty, message = "You have unsaved changes. Leave anyway?") {
Guarding unsaved changes with a React hook
custom-hooks
navigation-guard
event-listeners
Intermediate
7 steps
typescript
import { useState, useCallback } from 'react'; type Todo = { id: string;
Optimistic UI updates in a React hook
optimistic-updates
custom-hooks
error-handling
Intermediate
8 steps
javascript
import { useState } from 'react'; const steps = ['account', 'profile', 'review'];
Building a multi-step form wizard hook in React
custom-hooks
form-validation
state-management
Intermediate
9 steps
typescript
import { useEffect, useRef, useState } from "react"; export function useClickOutside<T extends HTMLElement>() { const ref = useRef<T>(null);
A dismiss-on-outside-click hook in React
custom-hooks
event-listeners
cleanup
Intermediate
7 steps