react-best-practices
0xbigboss/claude-code
Use Effects as escape hatches, prefer event handlers and render-time calculations for React component logic.
What is react-best-practices?
Guidance for writing React components with TypeScript, emphasizing when to use Effects, refs, custom hooks, and composition patterns. Use this skill when reading or writing .tsx/.jsx files with React imports to avoid common pitfalls like overusing Effects or prop drilling.
- Clarifies when Effects are appropriate (external system sync) vs. when to use event handlers, render-time calculations, useMemo, or key prop instead
- Provides decision tree for choosing between event handlers, computed values, useMemo, key prop, Effects, useEffectEvent, and refs
- Guides custom hook design to share logic without sharing state, and proper naming conventions
- Recommends composition patterns including children, compound components, and Context for scoped state instead of prop drilling
- Advises on controlled vs. uncontrolled components and when to use refs for non-rendering values
How to install react-best-practices
npx skills add https://github.com/0xbigboss/claude-code --skill react-best-practices- TypeScript skill recommended (pair with typescript-best-practices)
- React 16.8+ (hooks support)
How to use react-best-practices
- 1.When reading or writing React components, consult the decision tree to determine the right tool (event handler, render calculation, useMemo, key, Effect, useEffectEvent, or ref)
- 2.For Effects, verify the use case involves external system synchronization and include proper cleanup functions
- 3.Apply composition patterns and avoid prop drilling by using children and compound components
- 4.Name custom hooks with useXxx prefix only if they call other hooks; otherwise use regular functions
- 5.Reference react-patterns.md for code examples of each pattern
Use cases
- Deciding whether to use useEffect or a simpler alternative when implementing component behavior
- Refactoring prop-heavy components to use composition or compound components with provider-scoped state
- Designing custom hooks that share reusable logic across multiple components
- Integrating external systems like WebSockets, IntersectionObserver, or third-party libraries safely with Effects and cleanup
- Choosing between Context, refs, and event handlers for managing component state and parent-child communication
- React developers writing TypeScript components
- Teams standardizing on Effect usage and composition patterns
- Developers refactoring components with excessive props or Effects
react-best-practices FAQ
Only when you need to synchronize with external systems like browser APIs (WebSocket, IntersectionObserver), third-party non-React libraries, or window/document event listeners. For derived state, expensive calculations, resetting on prop change, or responding to user events, use alternatives like render-time calculation, useMemo, key prop, or event handlers.
No. Use ref callbacks instead of useRef for dynamic lists to properly handle elements being added or removed.
Avoid using boolean props that switch large component trees as a composition smell. Instead, prefer separate composed components for distinct use cases to keep components focused and maintainable.
No. Custom hooks share logic, not state—each call gets an independent state instance. If you need shared state, use Context or lift state to a parent component.
No. Use useEffect directly so the linter catches missing dependencies. Lifecycle-style hooks hide dependency tracking and make bugs harder to catch.
Full instructions (SKILL.md)
Source of truth, from 0xbigboss/claude-code.
name: react-best-practices description: Use when reading or writing React components (.tsx, .jsx files with React imports).
React Best Practices
Pair with TypeScript
When working with React, always load both this skill and typescript-best-practices together. TypeScript patterns (type-first development, discriminated unions, Zod validation) apply to React code.
Core Principle: Effects Are Escape Hatches
Effects let you "step outside" React to synchronize with external systems. Most component logic should NOT use Effects. Before writing an Effect, ask: "Is there a way to do this without an Effect?"
Decision Tree
- Need to respond to user interaction? Use event handler
- Need computed value from props/state? Calculate during render
- Need cached expensive calculation? Use
useMemo - Need to reset state on prop change? Use
keyprop - Need to synchronize with external system? Use Effect with cleanup
- Need non-reactive code in Effect? Use
useEffectEvent - Need mutable value that doesn't trigger render? Use ref
When to Use Effects
Synchronizing with external systems: browser APIs (WebSocket, IntersectionObserver), third-party non-React libraries, window/document event listeners, non-React DOM elements (video, maps).
When NOT to Use Effects
- Derived state — calculate during render
- Expensive calculations — use
useMemo - Resetting state on prop change — use
keyprop - Responding to user events — use event handlers
- Notifying parent of state changes — update both in the same event handler
- Chains of effects — calculate derived state and update in one event handler
Refs
- Use for values that don't affect rendering (timer IDs, DOM node references)
- Never read or write
ref.currentduring render; only in event handlers and effects - Use ref callbacks (not
useRefin loops) for dynamic lists - Use
useImperativeHandleto limit what parent can access
Custom Hooks
- Share logic, not state — each call gets an independent state instance
- Name
useXxxonly if it actually calls other hooks; otherwise use a regular function - Avoid lifecycle hooks (
useMount,useEffectOnce) — useuseEffectdirectly so the linter catches missing deps - Keep focused on a single concrete use case
Component Patterns
- Controlled: parent owns state; uncontrolled: component owns state
- Prefer composition with
childrenover prop drilling - Treat boolean props that switch large component trees (
isEditing,isThread,hideAttachments) as a composition smell; prefer separate composed components for distinct use cases - For complex reusable UI, prefer compound components with provider-scoped state/actions over monolithic components with many optional props
- Use Context for scoped component families as well as truly global state, when it defines a local interface consumed by descendants
- Render JSX directly for UI variation; avoid config-array mini-frameworks unless the config is real domain data
- Lift the provider boundary when sibling or external controls need access to the same state/actions
- Use
flushSyncwhen you need to read the DOM synchronously after a state update
See react-patterns.md for code examples and detailed patterns.
Related skills
More from 0xbigboss/claude-code and the wider catalog.

typescript-best-practices
Enforce type safety and prevent invalid states in TypeScript and JavaScript code.

web-fetch
Fetches web content as clean markdown by preferring markdown-native responses and falling back to selector-based HTML extraction. Use for documentation, articles, and reference pages at http/https URLs.

python-best-practices
Type-first Python patterns: immutable models, discriminated unions, and structured error handling.

design-lab
Conduct design interviews, generate five distinct UI variations in a temporary design lab, collect feedback, and produce implementation plans. Use when the user wants to explore UI design options, redesign existing components, or create new UI with multiple approaches to compare.

risk-management
Data-driven risk rules from 8500 trading samples to optimize position sizing and trade frequency.

trading-wisdom
Core trading insights learned from Agent Arena competition. Use when making any trading decision to apply institutional knowledge.