221005 TIL | unique "key" prop 오류 해결하기
Each child in a list should have a unique “key” prop 오류
- 리액트에서 배열을 렌더링 할 때에는 key 라는 props 를 설정해야한다.
- key 값은 각 원소들마다 가지고 있는 고유값으로 설정을 해야한다.
- users 배열에서는 id가 고유 값이 된다.
UserList.js
import React from 'react';
function User({ user }) {
return (
<div>
<b>{user.username}</b> <span>({user.email})</span>
</div>
);
}
function UserList() {
const users = [
{
id: 1,
username: 'velopert',
email: 'public.velopert@gmail.com'
},
{
id: 2,
username: 'tester',
email: 'tester@example.com'
},
{
id: 3,
username: 'liz',
email: 'liz@example.com'
}
];
return (
<div>
{users.map(user => (
<User user={user} key={user.id} />
))}
</div>
);
}
export default UserList;
- 만약 원소가 가지고 있는 고유한 값이 없다면 map() 콜백함수의 두번째 파라미터 index 를 key 로 사용하면 된다
<div>
{users.map((user, index) => (
<User user={user} key={index} />
))}
</div>
- 경고 메시지가 뜨는 이유는, 각 고유 원소에 key 값이 있어야만 배열이 업데이트 될 때 효율적으로 렌더링 될 수 있기 때문이다
- 리액트 라이브러리는 key prop을 사용하여 컴포넌트와 DOM 요소 간의 관계를 생성하고, 이 관계를 통해 컴포넌트 리렌더링 여부를 결정한다.
- 따라서 배열 안에 중복되는 key가 있거나 key 값이 없을 때 렌더링 시 오류 메세지가 콘솔 창에 출력되며, 업데이트가 효율적으로 이루어지지 않게 된다.
key값은 어떤 값을 넣어야 할까?
- 자바스크립트의 배열은 정적이지 않기 때문에 배열의 index를 key prop으로 사용하는 것은 지양해야 한다.
- 배열의 원소의 순서가 바뀌면 index도 바뀌고 컴포넌트마다 고유해야 하는 key 값도 바뀐다.
- 이는 리렌더링 시 잘못된 컴포넌트를 리렌더링 오류를 발생시킬 수 있다.
- key 값은 전역적으로 고유할 필요는 없으며 형제 요소에서 고유해야 한다.
출처
벨로퍼트와 함께하는 모던 리액트