import React, { useState, useCallback } from 'react'; export type Item = { id: string; label: string }; type ItemProps = { item: Item; onPick: (id: string) => void; renderSpy: (id: string) => void; }; // TODO: Item을 React.memo로 감싸세요. // renderSpy(item.id)는 컴포넌트 본문에서 호출해 렌더 횟수를 외부에서 셀 수 있게 합니다. function ItemBase({ item, onPick, renderSpy }: ItemProps) { renderSpy(item.id); return ( <li> <button onClick={() => onPick(item.id)}>{item.label}</button> </li> ); } export const Item = ItemBase; // TODO: React.memo(ItemBase)로 교체하세요 export function List({ items, renderSpy, }: { items: Item[]; renderSpy: (id: string) => void; }) { const [picked, setPicked] = useState<string | null>(null); const [unrelated, setUnrelated] = useState(0); // TODO: onPick을 useCallback으로 안정화하세요. setPicked는 stable이므로 의존성 [] 로 충분합니다. const onPick = (id: string) => setPicked(id); return ( <div> <span data-testid="picked">{picked ?? 'none'}</span> <span data-testid="unrelated">{unrelated}</span> <button onClick={() => setUnrelated(n => n + 1)}>bump</button> <ul> {items.map(item => ( <Item key={item.id} item={item} onPick={onPick} renderSpy={renderSpy} /> ))} </ul> </div> ); }
Tests