Loading skill
Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Standardized guidelines and patterns for Frontend React Components.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-05 | ✓→✗ | ▼ Worse | 41% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 12% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 28% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 55% | 0% |
Basic Functional Component
typescriptimport { FC } from 'react'; interface ButtonProps { children: React.ReactNode; variant?: 'primary' | 'secondary'; onClick?: () => void; disabled?: boolean; } export const Button: FC<ButtonProps> = ({ children, variant = 'primary', onClick, disabled = false }) => { return ( <button className={`btn btn-${variant}`} onClick={onClick} disabled={disabled} > {children} </button> ); };
1. Compound Components
typescriptexport const Card = ({ children }: { children: React.ReactNode }) => { return <div className="card">{children}</div>; }; Card.Header = ({ children }: { children: React.ReactNode }) => { return <div className="card-header">{children}</div>; }; Card.Body = ({ children }: { children: React.ReactNode }) => { return <div className="card-body">{children}</div>; }; // Usage <Card> <Card.Header>Title</Card.Header> <Card.Body>Content</Card.Body> </Card>
2. Render Props
typescriptinterface DataFetcherProps<T> { url: string; children: (data: T | null, loading: boolean) => React.ReactNode; } export function DataFetcher<T>({ url, children }: DataFetcherProps<T>) { const [data, setData] = useState<T | null>(null); const [loading, setLoading] = useState(true); useEffect(() => { fetch(url) .then(res => res.json()) .then(data => { setData(data); setLoading(false); }); }, [url]); return <>{children(data, loading)}</>; } // Usage <DataFetcher<User> url="/api/user"> {(user, loading) => ( loading ? <Spinner /> : <UserProfile user={user} /> )} </DataFetcher>
3. Controlled vs Uncontrolled
typescript// Controlled export function ControlledInput({ value, onChange }: { value: string; onChange: (value: string) => void; }) { return ( <input value={value} onChange={e => onChange(e.target.value)} /> ); } // Uncontrolled export function UncontrolledInput({ defaultValue }: { defaultValue?: string; }) { const inputRef = useRef<HTMLInputElement>(null); return <input ref={inputRef} defaultValue={defaultValue} />; }
Do's:
typescripttype ButtonProps = | { variant: 'primary'; onClick: () => void } | { variant: 'link'; href: string };
Don'ts:
components/
├── Button/
│ ├── Button.tsx
│ ├── Button.test.tsx
│ ├── Button.stories.tsx
│ └── index.ts
└── Card/
├── Card.tsx
├── CardHeader.tsx
├── CardBody.tsx
├── index.ts
└── Card.test.tsxOther measured skills in the registry, with their headline benchmark lift.