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>
<User user={users[0]} />
<User user={users[1]} />
<User user={users[2]} />
</div>
);
}
export default UserList;
이러한 배열을 컴포넌트로 렌더링 하고자 할 때, 배열이 고정적이라면 상관없겠지만, 배열의 인덱스를 하나하나 조회해가면서 렌더링하는 방법은 동적인 배열을 렌더링하지 못한다.
동적인 배열 렌더링
동적인 배열을 렌더링해야 할 때에는 자바스크립트 배열의 내장함수 map( )
을 사용한다.
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} />
))}
</div>
);
}
export default UserList;
이런식으로 map 함수를 사용하면 배열 안에 있는 각 원소를 변환하여 새로운 배열을 만들어주므로, 배열의 모든 원소가 렌더링 된다. 하지만 브라우저에서 콘솔창을 열게 되면 에러가 뜬다.
배열의 key 값 설정
🚨 리액트에서 배열을 렌더링 할 때에는 key
라는 props
를 설정해야 한다. (고유값)
key
값은 각 원소들마다 가지고 있는 고유값을 줌으로써 리렌더링 성능을 최적화 할 수 있게 해준다.
위의 코드 배열에서는 고유값이 id 이므로 id 를 key 값으로 줄 수 있다.
고유 원소에는 key
가 있어야 배열에 업데이트 될 때 효율적으로 렌더링 된다.
key
값이 어떤 원소를 가리키는지 알고 있기 때문에 수정되지 않는 기존의 값은 그대로 두고 원하는 곳에 내용을 삽입하거나 삭제하기 때문이다.
<div>
{users.map(user => (
<User user={user} key={user.id} />
))}
</div>
배열 안의 원소가 가지고 있는 고유한 값이 없다면 map( )
함수를 사용할 때 설정하는 콜백함수의 두번째 파라미터 index
를 key
로 사용하면 된다.
<div>
{users.map((user, index) => (
<User user={user} key={index} />
))}
</div>
Key 가 필요한 이유
Map 에서 key 값이 없다면 중간의 값이 바뀌었을 때 그 하위 값들이 전부 변하기 때문이다.
key 값을 사용한다면 key 를 이용해 중간에 값을 추가하게 된다.
key의 존재 유무에 따른 업데이트 방식
const array = ['a', 'b', 'c', 'd'];
array.map(item => <div>{item}</div>);
이런식으로 비효율적으로 작업이 이루어진다. 하지만 key 값이 있다면 이 작업은 개선된다.
[
{
id: 0,
text: 'a'
},
{
id: 1,
text: 'b'
},
{
id: 2,
text: 'c'
},
{
id: 3,
text: 'd'
}
];
array.map(item => <div key={item.id}>{item.text}</div>);
때문에 배열을 렌더링 할 때 고유한 key 값이 있는 것이 중요하며, 만약에 배열 안에 중복되는 key 가 있을 때는 렌더링 시에 오류메시지가 콘솔에 나타나게 되며, 업데이트가 제대로 이루어지지 않게 된다.