;
}
// Usage - Flexible composition
function UserCard({ user }) {
return (
{user.name}
{user.bio}
);
}
// ❌ Avoid: Monolithic components with too many props
function Card({ title, body, footer, hasHeader, headerColor, ... }) {
// Too many responsibilities
}
```
### 4. **Context for Global State**
```jsx
// Create context for theme
const ThemeContext = createContext();
function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme(prev => prev === 'light' ? 'dark' : 'light');
};
return (
{children}
);
}
// Custom hook for easy access
function useTheme() {
const context = useContext(ThemeContext);
if (!context) {
throw new Error('useTheme must be used within ThemeProvider');
}
return context;
}
// Usage
function ThemeToggle() {
const { theme, toggleTheme } = useTheme();
return ;
}
```
## Performance Optimization
### 1. **Memoization**
```jsx
// useMemo for expensive calculations
function ProductList({ products, filters }) {
const filteredProducts = useMemo(() => {
return products.filter(product => {
// Expensive filtering logic
return matchesFilters(product, filters);
});
}, [products, filters]);
return
{filteredProducts.map(/* ... */)}
;
}
// useCallback for function references
function TodoList() {
const [todos, setTodos] = useState([]);
// Without useCallback, this creates new function on every render
const handleToggle = useCallback((id) => {
setTodos(prev => prev.map(todo =>
todo.id === id ? { ...todo, done: !todo.done } : todo
));
}, []);
return (
{todos.map(todo => (
))}
);
}
// React.memo to prevent unnecessary re-renders
const TodoItem = React.memo(function TodoItem({ todo, onToggle }) {
return (
;
}
// Type events
function handleClick(event: React.MouseEvent) {
event.preventDefault();
// ...
}
// Type refs
const inputRef = useRef(null);
// Type custom hooks
function useLocalStorage(key: string, initialValue: T) {
const [value, setValue] = useState(() => {
const stored = localStorage.getItem(key);
return stored ? JSON.parse(stored) : initialValue;
});
useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [key, value]);
return [value, setValue] as const;
}
```
## When to Use This Skill
- Building React applications or components
- Optimizing React performance
- Implementing complex state management
- Creating reusable hooks and components
- Setting up React project architecture
- Migrating from class to functional components
---
**Remember**: React is about composition and data flow. Keep components small, focused, and reusable. Let state drive UI changes declaratively.