1. 배열에서 데이터 렌더링하기
2. 항목 배열 필터링하기
3. key로 목록의 항목 순서 유지하기
// 예시
const people = [
'Creola Katherine Johnson: mathematician',
'Mario José Molina-Pasquel Henríquez: chemist',
'Mohammad Abdus Salam: physicist',
'Percy Lavon Julian: chemist',
'Subrahmanyan Chandrasekhar: astrophysicist'
];
people
멤버를 새로운 JSX 노드 배열인 listItems
에 매핑const listItems = people.map(person => <li>{person}</li>);
<ul>
로 감싼 listItems
를 반환return <ul>{listItems}</ul>;
const people = [
'Creola Katherine Johnson: mathematician',
'Mario José Molina-Pasquel Henríquez: chemist',
'Mohammad Abdus Salam: physicist',
'Percy Lavon Julian: chemist',
'Subrahmanyan Chandrasekhar: astrophysicist'
];
export default function List() {
const listItems = people.map(person =>
<li>{person}</li>
);
return <ul>{listItems}</ul>;
}
경고: 목록의 각 자식에는 고유한 “key” prop이 있어야 합니다.
const people = [{
id: 0,
name: 'Creola Katherine Johnson',
profession: 'mathematician',
}, {
id: 1,
name: 'Mario José Molina-Pasquel Henríquez',
profession: 'chemist',
}, {
id: 2,
name: 'Mohammad Abdus Salam',
profession: 'physicist',
}, {
name: 'Percy Lavon Julian',
profession: 'chemist',
}, {
name: 'Subrahmanyan Chandrasekhar',
profession: 'astrophysicist',
}];
people
에서 person.profession === 'chemist'
조건으로 filter()
를 호출하여, “chemist”만 있는 새로운 배열인 chemists
를 생성한다.const chemists = people.filter(person =>
person.profession === 'chemist'
);
chemists
위에 매핑한다.const listItems = chemists.map(person =>
<li>
<img
src={getImageUrl(person)}
alt={person.name}
/>
<p>
<b>{person.name}:</b>
{' ' + person.profession + ' '}
known for {person.accomplishment}
</p>
</li>
);
listItems
를 반환한다.return <ul>{listItems}</ul>;
주의
- 화살표 함수는
=>
바로 뒤에 표현식을 암시적으로 반환하므로return
문이 필요하지 않다.const listItems = chemists.map(person => <li>...</li> // Implicit return! );
- 그러나
=>
뒤에{
중괄호가 오는 경우return
을 명시적으로 작성해야 한다.const listItems = chemists.map(person => { // Curly brace return <li>...</li>; });
=> {
가 포함된 화살표 함수는 “블록 본문”을 가져야 한다.
이 경우 한 줄 이상의 코드를 작성할 수 있지만, 반드시 직접return
문을 작성해야 한다.
return
을 잊으면 아무것도 반환되지 않는다.
key
로 목록의 항목 순서 유지하기map()
호출 내부의 JSX 요소에는 항상 key
가 필요하다.key
는 각 컴포넌트가 어떤 배열 항목에 해당하는지 React에 알려주어 나중에 매칭할 수 있도록 한다.key
는 React가 정확히 무슨 일이 일어났는지 추론하고 DOM 트리를 올바르게 업데이트하는 데 도움된다.3-1. key
를 얻을 수 있는 곳
crypto.randomUUID()
또는 uuid
와 같은 패키지를 사용하자.3-2. key 규칙
3-3. React에 key가 필요한 이유는?
key
를 통해 그 항목을 식별할 수 있다.주의
- 배열에서 항목의 인덱스를 key로 사용하고 싶을 수도 있습니다.
key
를 지정하지 않으면, React는 인덱스를 key로 사용한다.
그러나 렌더링한 항목의 순서는 새 항목이 삽입되거나, 삭제되거나, 배열의 순서가 바뀌는 등에 따라 변경될 수 있습니다.
인덱스를 key로 사용하면 종종 미묘하고 혼란스러운 버그가 발생한다.- 마찬가지로
key={Math.random()}
과 같이 즉석에서 key를 생성하면 안된다.
이렇게 하면 렌더링될 때마다 key가 일치하지 않아 매번 모든 컴포넌트와 DOM이 다시 생성된다.
속도가 느려질 뿐만 아니라 목록 항목 내부의 사용자 입력도 손실된다.
대신 데이터에 기반한 안정적인 ID를 사용하자.- 컴포넌트는
key
를 prop으로 받지 않는다는 점에 유의하자.
React 자체에서 힌트로만 사용된다.
컴포넌트에 ID가 필요한 경우 별도의 프로퍼티로 전달해야 한다.
// 예시 <Profile key={id} userId={id} />
map()
을 사용하여 비슷한 컴포넌트 집합을 생성하는 방법.filter()
를 사용하여 필터링된 항목의 배열을 만드는 방법.key
를 설정해 위치나 데이터가 변경되더라도 React가 각 컴포넌트를 추적할 수 있도록 하는 이유와 방법.