React의 key란 무엇인가?
- 리스트를 랜더링 할 때 엘리먼트를 구분하는 고유 식별자 역할
- 어떤 항목이 변경(추가, 삭제, 정렬 변경)되었는지 효율적으로 파악하고, 필요한 부분만 다시 렌더링함
React의 index란?
- 배열을 순회하며 리스트를 랜더링할 때(.map), 현재 요소가 몇 번째인지 나타내는 정수 값
const fruits = ['Apple', 'Banana', 'Orange'];
const fruitList = fruits.map((fruit, index) => {
return (
<li key={index}>
{fruit} (index: {index})
</li>
);
});
간단하게 구현하는 경우에는 이처럼 key에 index값을 쓰곤 하는데, 사실 이러면 문제가 생길 수 있다.
- React의 리스트에서 index를 key값으로 설정하면 안되는 이유
- 항목의 순서가 바뀔 때 렌더링 문제 발생할 수 있음.
- 배열의 순서를 바꾸거나, 중간에 요소를 추가/삭제하면 기존 index와 새 index가 일치하지 않음
- React는 key를 기준으로 어떤 엘리먼트가 변경되었는지 파악함. 이 기준 값이 변경되는 문제가 생기는 것.
- 동일한 항목임에도 중간 항목 변경으로 index가 바뀌면서 key에도 영향을 주어 불필요한 재랜더링이 발생.
- 컴포넌트 상태 관리에 문제가 생길 수 있음
- React는 key가 바뀌면 새로운 컴포넌트로 인식해, index가 바뀌면 기존 컴포넌트의 state가 리셋될 수 있음
- 의미있는 고유 식별자가 아님
- index는 배열 내에서 순서를 나타낼 뿐, 항목의 고유값이 아님
- 항목의 순서가 바뀔 때 렌더링 문제 발생할 수 있음.
- 그럼 무엇을 key값으로 써야 하는가?
- 서버에서 받아온 데이터 값에 고유한 식별자가 있다면 이를 key값으로 쓰는 것이 가장 좋음
- 데이터가 삽입되거나 삭제 되어도, 각 항목에 맵핑된 id 같은 고유 값은 변하지 않기 때문
function UserList() {
const users = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 },
{ id: 3, name: 'Charlie', age: 35 },
];
return (
<ul>
{users.map((user) => (
// 고유한 id를 key로 사용
<li key={user.id}>
{user.name} - Age: {user.age}
</li>
))}
</ul>
);
}
export default UserList;
출처
1. 매일메일 25.01.09. 42번 문제. 리액트에서 index를 key값으로 사용하면 안되는 이유. https://maeil-mail.kr
2. react 배열의 index를 key로 쓰면 안되는 이유. (예시를 직접 ui로 보여줘서 이해가 잘됨)
'개발자 강화 > 프론트엔드' 카테고리의 다른 글
[매일메일] 웹 어플리케이션의 성능을 최적화 하는 방법? (FE.250107/250102) (0) | 2025.01.15 |
---|---|
[매일메일] SSR의 개념과 장단점? (FE.250115) (0) | 2025.01.15 |
[매일메일] 디바운스와 쓰로틀, 무한 스크롤? (FE.250108) (0) | 2025.01.14 |
[매일메일] 사용자가 웹사이트에 접근하면 발생하는 일?(FE.241225/BE.250110) (0) | 2025.01.14 |
[매일메일] 웹 접근성과 개선 방법 (FE.250114) (0) | 2025.01.14 |