AI Skill Library

React Hooks Patterns

Idiomatic React hooks usage: state, effects, memo, refs, custom hooks.

reactfrontend
# React Hooks Patterns

## useState
- Functional updates when next state depends on previous: `setX(prev => prev + 1)`
- Lazy init for expensive default: `useState(() => compute())`

## useEffect
- Cleanup pattern:
```tsx
useEffect(() => {
  const id = setInterval(tick, 1000)
  return () => clearInterval(id)
}, [])
```
- Avoid object/array literals in deps (recreated each render). Memoize or use primitives.
- Don't put effects inside conditionals; gate inside the effect.

## useMemo / useCallback
- Use only when:
  - Dep equality check is cheaper than the computation, OR
  - The memoized value is passed to a `React.memo` child / hook dep.
- Premature memoization adds noise.

## useRef
- Mutable box that doesn't trigger re-render: `ref.current = value`
- DOM ref: `<input ref={inputRef} />`

## Custom hooks
- Name starts with `use`. Compose hooks freely.
```ts
function useDebounce<T>(value: T, ms = 300) {
  const [v, setV] = useState(value)
  useEffect(() => {
    const id = setTimeout(() => setV(value), ms)
    return () => clearTimeout(id)
  }, [value, ms])
  return v
}
```

## Rules
- Call hooks at the top level, never in loops/conditions.
- Only call from React function components or other hooks.

API: /api/skills/react-hooks-patterns