react-hooks
Best practices for React Hooks usage and custom hook creation.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
React Hooks
Priority: P1 (OPERATIONAL)
Effective usage of React Hooks.
Implementation Guidelines
- Rules: Top-level only. Only in React functions.
-
useEffect: Sync with external systems ONLY. Cleanup required. -
useRef: Mutable state without re-renders (DOM, timers, tracking). -
useMemo/Callback: Measure first. Use for stable refs or heavy computation. - Dependencies: Exhaustive deps always. Fix logic, don't disable linter.
-
Custom Hooks: Extract shared logic. Prefix
use*. - Refs as Escape Hatch: Access imperative APIs (focus, scroll).
-
Stability: Use
useLatestpattern (ref) for event handlers to avoid dependency changes. -
Concurrency:
useTransition/useDeferredValuefor non-blocking UI updates. -
Initialization: Lazy state
useState(() => expensive()).
Anti-Patterns
- No Effects for Data Flow: Derive state in render.
- No Missing Deps: Causes stale closures.
- No Complex Effects: Split into multiple simple effects.
-
No Oversubscription: Check
why-did-you-render.
Code
// Custom Hook
function useWindowSize() {
const [size, setSize] = useState({ w: 0, h: 0 });
useEffect(() => {
function handleResize() {
setSize({ w: window.innerWidth, h: window.innerHeight });
}
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []); // Empty = mount only
return size;
}
// Lazy Init
const [state, setState] = useState(() => computeExpensiveValue());
Reference & Examples
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-26
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!