---
name: react-component-patterns
description: Build modern React component architecture with composition patterns. Use when designing reusable React components, applying composition patterns, or structuring component hierarchies.
metadata:
triggers:
files:
- '**/*.jsx'
- '**/*.tsx'
keywords:
- component
- props
- children
- composition
- hoc
- render-props
---
# React Component Patterns
## **Priority: P0 (CRITICAL)**
## Implementation Guidelines
- **Architecture (default)**: Composition first — `children`/named slot props for layout, **Compound Components** (e.g., ``) via Context for implicit shared state within one UI unit. Reach for **Higher-Order Components** or classic **Render Props** (`render={(data) => ...}`) only when composition can't express it (e.g. wrapping a third-party class component) — hooks cover most cross-cutting concerns HOCs used to.
- **React 19**: `ref` is a regular prop on function components — no `forwardRef` needed for new code. Use `use(promise)` / `use(context)` to read a promise or context conditionally in render instead of `useContext` + extra `useEffect` plumbing.
- **Components**: Distinguish between **Controlled** (state from props) and **Uncontrolled** (local `useRef` state) components. Favor controlled for form validation.
- **Props**: Use **Explicit TS interfaces**. Avoid **Prop Drilling** by leveraging **Context API** or **Zustand** for global/deeply nested state.
- **Boolean Props**: Shorthand `` vs `isVisible={true}`.
- **Conditionals**: Ternary (`Cond ? : `) over `&&` for rendering consistency (prevents `0` rendering).
- **Function Components**: Only hooks. No classes. Small size (<250 lines). One component per file.
- **Exports**: Named exports only. **PascalCase** naming.
```tsx
function ThemedInput({ ref, ...props }: { ref?: React.Ref } & InputProps) {
return ;
}
```
## Verify
- [ ] Shared implicit state uses Compound Components + Context, not prop drilling.
- [ ] `ref` passed as a plain prop (no `forwardRef`) on components targeting React 19.
- [ ] HOC/classic render-props only where composition genuinely can't express the wrap.
## Anti-Patterns
- **No Classes**: Use hooks.
- **No Prop Drilling**: Use Context/Zustand.
- **No Nested Definitions**: Define components at top level.
- **No Index Keys**: Use stable IDs.
- **No forwardRef on new React 19 code**: Accept `ref` as a normal prop instead.
## References
See [references/patterns.md](references/patterns.md) for Composition, Compound Components, and Render Props examples.