React에서 배열을 렌더링할 때는 map()
을 사용하고 각 요소에 key
를 반드시 지정해야 해.
TypeScript에서는 배열 요소의 타입과 key의 안정성을 명확하게 정의하는 것이 중요해.
map
시 key 타입const fruits = ['사과', '바나나', '포도'];
const FruitList = () => {
return (
<ul>
{fruits.map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
);
};
✅ index를 key로 쓰는 건 데이터가 변하지 않을 때만 안전해.
삭제/추가되는 리스트엔 고유 ID를 사용하는 게 좋아.
type Todo = {
id: number;
text: string;
completed: boolean;
};
const todos: Todo[] = [
{ id: 1, text: '공부하기', completed: false },
{ id: 2, text: '산책하기', completed: true },
];
const TodoList = () => {
return (
<ul>
{todos.map((todo) => (
<li key={todo.id}>
<span>{todo.text}</span> -{' '}
<strong>{todo.completed ? '완료' : '미완료'}</strong>
</li>
))}
</ul>
);
};
✅ 객체 배열을 렌더링할 때는 id 같은 고유값을 key로 지정해야 리렌더링 최적화가 제대로 작동돼.
const UserList = ({
users,
}: {
users: { id: string; name: string }[];
}) => {
return (
<ul>
{users.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
};
✅ index는 같은 내용이 순서만 바뀌어도 React가 새 요소로 인식하지 못하는 문제가 있음.
그래서 **고유 식별자(id)**를 key로 쓰는 것이 안정적이야.
const TodoListFiltered = ({ completed }: { completed: boolean }) => {
const todos = [
{ id: 1, text: '코딩', completed: true },
{ id: 2, text: '운동', completed: false },
];
const filtered = todos.filter((todo) => todo.completed === completed);
return (
<ul>
{filtered.map((todo) => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
);
};
✅ filter → map 패턴은 매우 흔하며, 이때도 key는 반드시 필터링된 요소의 고유값으로 사용해야 해.