review-react
React Code Review Guidelines
Performance optimization and correctness guide for React applications. Contains 23 rules across 4 categories, prioritized by impact.
When to Apply
Reference these guidelines when:
- Writing or reviewing React components and hooks
- Optimizing re-render performance
- Refactoring state management or effect logic
- Reviewing pull requests that touch React code
Rule Categories by Priority
| Priority | Category | Impact | Prefix | Rules |
|---|---|---|---|---|
| 1 | Rules of React | CRITICAL | react-rules- |
3 |
| 2 | Re-render Optimization | MEDIUM | rerender- |
13 |
| 3 | Rendering Performance | MEDIUM | rendering- |
5 |
| 4 | Advanced Patterns | LOW | advanced- |
2 |
Quick Reference
1. Rules of React (CRITICAL)
react-rules-purity- Components and Hooks must be pure; no side effects during renderreact-rules-hooks- Only call Hooks at the top level and from React functionsreact-rules-calling- Never call components as functions or pass Hooks as values
2. Re-render Optimization (MEDIUM)
rerender-no-inline-components- Never define components inside other componentsrerender-derived-state-no-effect- Derive state during render, not in effectsrerender-memo- Extract memoized child components to avoid re-rendersrerender-memo-with-default-value- Hoist default non-primitive props outside memorerender-simple-expression-in-memo- Don't useMemo for simple primitive expressionsrerender-defer-reads- Don't subscribe to state only used in callbacksrerender-dependencies- Use primitive values in effect dependenciesrerender-derived-state- Subscribe to derived booleans, not raw objectsrerender-functional-setstate- Use functional setState for stable callbacksrerender-lazy-state-init- Pass initializer function to useState for expensive valuesrerender-move-effect-to-event- Move interaction logic from effects to event handlersrerender-transitions- Use startTransition for non-urgent state updatesrerender-use-ref-transient-values- Use refs for frequently-changing transient values
3. Rendering Performance (MEDIUM)
rendering-hoist-jsx- Hoist static JSX outside component functionsrendering-conditional-render- Use ternary operator instead of && for conditional renderingrendering-usetransition-loading- Prefer useTransition over manual loading staterendering-content-visibility- Use CSS content-visibility: auto for long listsrendering-activity- Use Activity component for preserving hidden UI state
4. Advanced Patterns (LOW)
advanced-event-handler-refs- Store latest event handlers in refs for stable callbacksadvanced-init-once- Initialize app-level singletons once, not per mount
Review Discipline
Never downgrade CRITICAL violations
When a CRITICAL rule violation is detected (e.g., react-rules-purity), fix it — do not rationalize exceptions. Common rationalizations to reject:
- "It's idempotent, so Strict Mode double-render is fine" — Strict Mode is not the only concern; Concurrent Mode render abandonment is the real danger.
- "It works in practice" — Concurrent features may not be active today but the code must be correct when they are.
- "Adding a comment explaining the intent is sufficient" — A comment does not prevent the bug. If the rule says "don't do X", the fix is to stop doing X.
If you detect a violation, move to "fix" before moving to "judge severity." The cost of a false positive (unnecessary refactor) is far lower than the cost of a false negative (shipping a Concurrent Mode bug).
Re-check after refactors
When a fix for one issue changes the code structure (e.g., adding callback to useEffect deps), re-run the full rule check on the modified code. A fix for one rule can regress another — e.g., fixing rerender-dependencies can reintroduce a react-rules-purity violation if it moves code back into render phase.
How to Use
Read individual rule files for detailed explanations and code examples:
rules/react-rules-purity.md
rules/rerender-no-inline-components.md
Each rule file contains:
- Brief explanation of why it matters
- Incorrect code example
- Correct code example
- Reference links