---
name: react
description: "React component patterns, hooks, and best practices for modern React development. Functional components, proper hook usage, memoization, and performance optimization. Trigger: When creating React components, implementing hooks, managing state, or optimizing React performance."
skills:
- conventions
- a11y
- typescript
- javascript
- architecture-patterns
- humanizer
dependencies:
react: ">=17.0.0 <19.0.0"
allowed-tools:
- documentation-reader
- web-search
---
# React Skill
## Overview
Modern React patterns using hooks, functional components, and best practices for building maintainable UIs.
## Objective
Guide developers in building React applications with proper component architecture, state management, and performance optimization.
---
## When to Use
Use this skill when:
- Creating React functional components or refactoring class components
- Implementing hooks (useState, useEffect, useMemo, useCallback)
- Managing component state and side effects
- Optimizing React performance and preventing unnecessary re-renders
- Building component composition patterns
- Integrating with React ecosystem libraries
Don't use this skill for:
- Non-React JavaScript patterns (use javascript skill)
- React Native mobile development (use react-native skill)
- Redux state management (use redux-toolkit skill)
- Server-side framework specifics (use astro or relevant framework skill)
---
## 📚 Extended Mandatory Read Protocol
**This skill has a `references/` directory with detailed guides for complex React patterns.**
### Reading Rules
**Read references/ when:**
- **MUST read [hooks-advanced.md](references/hooks-advanced.md)** when:
- Deciding useState vs useReducer (4+ related state values)
- Creating custom hooks or composing hooks
- Dealing with stale closures or hook dependencies
- **MUST read [useEffect-patterns.md](references/useEffect-patterns.md)** when:
- Implementing data fetching, subscriptions, or side effects
- Handling cleanup, race conditions, or async operations
- Debugging dependency array issues
- **MUST read [performance.md](references/performance.md)** when:
- Components re-rendering unnecessarily
- Working with expensive computations or large lists
- Profiling and optimizing React applications
- **MUST read [context-patterns.md](references/context-patterns.md)** when:
- Sharing state across multiple components
- Building compound components or component APIs
- Optimizing context performance (preventing re-renders)
- **MUST read [forms-state.md](references/forms-state.md)** when:
- Building forms with validation
- Choosing controlled vs uncontrolled inputs
- Implementing multi-step forms or file uploads
**Quick reference only:** Use this SKILL.md for simple components and quick lookups. Decision Tree below directs you to specific references when needed.
### Reading Priority
| Situation | Read This | Why |
| ----------------------------------- | ------------------------------------ | ----------------------------------- |
| Simple component (<3 state values) | SKILL.md only | No deep dive needed |
| Complex state (useReducer decision) | **hooks-advanced.md** (REQUIRED) | 40+ patterns for state management |
| Data fetching or subscriptions | **useEffect-patterns.md** (REQUIRED) | Race conditions, cleanup patterns |
| Performance optimization | **performance.md** (REQUIRED) | Profile first, optimize correctly |
| State sharing across components | **context-patterns.md** (REQUIRED) | Performance pitfalls avoided |
| Form implementation | **forms-state.md** (REQUIRED) | Controlled vs uncontrolled decision |
**See [references/README.md](references/README.md)** for complete navigation guide.
---
## Critical Patterns
### ✅ REQUIRED: Use Functional Components with Hooks
```typescript
// ✅ CORRECT: Functional component with hooks
const Counter: React.FC = () => {
const [count, setCount] = useState(0);
return ;
};
// ❌ WRONG: Class component (legacy pattern)
class Counter extends React.Component {
state = { count: 0 };
render() { /* ... */ }
}
```
### ✅ REQUIRED: Proper useEffect Dependencies
```typescript
// ✅ CORRECT: All dependencies included
useEffect(() => {
fetchData(userId);
}, [userId]);
// ❌ WRONG: Missing dependencies (causes stale closures)
useEffect(() => {
fetchData(userId);
}, []); // userId missing
```
### ✅ REQUIRED: Stable Keys for Lists
```typescript
// ✅ CORRECT: Use unique IDs
{items.map(item =>
{item.name}
)}
// ❌ WRONG: Using array index (causes bugs on reorder/delete)
{items.map((item, index) =>
{item.name}
)}
```
### ❌ NEVER: Conditional Hook Calls
```typescript
// ❌ WRONG: Hooks must not be conditional
if (condition) {
const [value, setValue] = useState(0); // Breaks React rules
}
// ✅ CORRECT: Hooks at top level, conditional logic inside
const [value, setValue] = useState(0);
const shouldUse = condition ? value : defaultValue;
```
---
## Conventions
Refer to conventions for:
- Code organization
- Naming patterns
Refer to a11y for:
- Semantic HTML in JSX
- Keyboard navigation
- ARIA attributes
### React Specific
- Use functional components with hooks
- Implement proper component composition
- Memoize expensive computations with useMemo
- Use useCallback for event handlers in optimized components
- Handle side effects with useEffect
- Provide keys for lists
## Decision Tree
**Simple state (<3 values)?** → Use `useState`. **[See hooks-advanced.md](references/hooks-advanced.md#usestate-patterns)** for patterns.
**Complex state (4+ related values)?** → Use `useReducer` for centralized logic. **MUST read [hooks-advanced.md](references/hooks-advanced.md#usereducer-patterns)** for reducer patterns.
**Side effect needed?** → Use `useEffect` with proper dependency array. **MUST read [useEffect-patterns.md](references/useEffect-patterns.md)** for cleanup, race conditions, and async patterns.
**Data fetching?** → Use `useEffect` with AbortController. **MUST read [useEffect-patterns.md#async-patterns](references/useEffect-patterns.md#async-patterns)** for race condition handling.
**Performance issue?** → Profile first with React DevTools Profiler. **MUST read [performance.md](references/performance.md)** for useMemo, useCallback, React.memo patterns.
**Expensive computation?** → Use `useMemo` if calculation is costly. **CHECK [performance.md#usememo](references/performance.md#usememo)** to decide if worth it.
**Passing callbacks to memoized children?** → Use `useCallback`. **CHECK [performance.md#usecallback](references/performance.md#usecallback)** for stable references.
**Sharing state across components?** → Use Context API or lift state. **MUST read [context-patterns.md](references/context-patterns.md)** for performance optimization and splitting contexts.
**Building component API?** → Use compound components pattern. **CHECK [context-patterns.md#compound-components](references/context-patterns.md#compound-components)** for implicit state sharing.
**Form with validation?** → Use controlled components. **MUST read [forms-state.md](references/forms-state.md)** for controlled vs uncontrolled and validation patterns.
**Multi-step form?** → Use wizard pattern with step state. **CHECK [forms-state.md#multi-step-forms](references/forms-state.md#multi-step-forms)**.
**File upload?** → Use controlled input with File API. **CHECK [forms-state.md#file-uploads](references/forms-state.md#file-uploads)** for single/multiple uploads with progress.
**List rendering?** → Always provide stable `key` prop (use unique IDs, not indices). For large lists (1000+), **MUST read [performance.md#list-rendering-optimization](references/performance.md#list-rendering-optimization)** for virtualization.
**Conditional rendering?** → Use `&&` for simple conditions, ternary `? :` for if-else, early return for complex logic.
---
## Example
```typescript
import { useState, useEffect, useMemo } from 'react';
interface TodoProps {
items: string[];
}
const TodoList: React.FC = ({ items }) => {
const [filter, setFilter] = useState('');
const filteredItems = useMemo(() =>
items.filter(item => item.toLowerCase().includes(filter.toLowerCase())),
[items, filter]
);
return (
setFilter(e.target.value)} />
{filteredItems.map((item, index) => (
{item}
))}
);
};
```
---
## Edge Cases
**Stale closures in useEffect:** When state/props aren't in dependency array, closures capture old values. Always include all dependencies or use functional setState: `setState(prev => prev + 1)`.
**useEffect cleanup:** Return cleanup function for subscriptions, timers, event listeners to prevent memory leaks:
```typescript
useEffect(() => {
const timer = setInterval(() => {}, 1000);
return () => clearInterval(timer); // Cleanup
}, []);
```
**Ref vs State:** Use `useRef` for values that don't trigger re-renders (DOM elements, mutable values). Use `useState` for values that should trigger UI updates.
**Batching updates:** React batches multiple setState calls in event handlers. In async code (setTimeout, promises), use `flushSync` for immediate updates (rare cases).
**Children prop patterns:** When passing children, use `React.ReactNode` type. For render props, use function children: `{(data) => }`.
---
## Advanced Architecture Patterns
**⚠️ Read This First**: Most React projects do NOT need advanced architecture patterns. Apply only when:
1. **AGENTS.md explicitly specifies** architecture requirements
2. **Codebase already uses** domain/, application/, infrastructure/ folders
3. **User explicitly requests** architectural patterns
**If none apply** → Skip this section, use React best practices above.
### Quick Context Verification
```bash
# Check AGENTS.md
cat agents/your-project/AGENTS.md | grep -i "architecture\|solid\|clean\|ddd"
# Check codebase structure
ls src/domain src/application src/infrastructure
```
- **AGENTS.md mentions patterns OR folders exist OR user requests** → Apply patterns
- **None of above** → Use standard React patterns only
### Applicable Patterns
- **SRP**: Separate data fetching, logic, presentation (one responsibility per component/hook)
- **DIP**: Abstract services (use Context API or hooks, not direct imports)
- **Result Pattern**: Type-safe async error handling
- **Clean Architecture**: Layer separation when business logic is complex
### For Complete Guide
**MUST read** [architecture-patterns/references/frontend-integration.md](../architecture-patterns/references/frontend-integration.md) for:
- Complete React examples with Clean Architecture
- SRP for components and hooks
- DIP with Context API
- Result Pattern in hooks
- Layer separation (domain/, application/, infrastructure/, presentation/)
- When to apply and when to stop
**Also see**: [architecture-patterns/SKILL.md](../architecture-patterns/SKILL.md) for Decision Tree and pattern selection.
---
## References
- https://react.dev/
- https://react.dev/reference/react