여러개의 Element를 리스트 고차함수를 통해 만들 수 있다.
const numbers = [1,2,3,4,5];
const listItems = numbers.map(number => <li>{number}</li>);
<ul>{listItems}</ul>
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map(number => <li key={number.toString()}>{number}</li>);
return <ul>{listItems}</ul>;
}
const numbers = [1,2,3,4,5];
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<NumberList numbers={numbers} />);
렌더링을 진행하면, key를 넣어야한다는 문구가 뜬다. 이는 Element list를 만들 때 포함해야하는 특수한 문자열 attribute이다.
Key는 React가 어떤 항목을 변경, 추가 또는 삭제할지를 식별하는 것을 돕는다. Element의 안정적인 고유성을 부여하기 위해 사용한다. 각 항목의 고유성을 나타내는 문자열을 사용한다.(id) 하지만, 고유한 값이 없다면 index를 키로 사용한다. 하지만 이는 단점이 있다. (참고: https://robinpokorny.medium.com/index-as-a-key-is-an-anti-pattern-e0349aece318)
key는 주변 배열의 context에서만 의미가 있다.
다음을 보자
function ListItem(props) {
const value = props.value;
return (
// 틀렸습니다! 여기에는 key를 지정할 필요가 없습니다.
<li key={value.toString()}>
{value}
</li>
);
}
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
// 틀렸습니다! 여기에 key를 지정해야 합니다.
<ListItem value={number} />
);
return (
<ul>
{listItems}
</ul>
);
}
여기서 배열은 ListItem
으로 구성되어 있다. 그러므로 li
태그가 아닌 ListItem
컴포넌트에 key를 할당해야한다.
function ListItem(props) {
// 맞습니다! 여기에는 key를 지정할 필요가 없습니다.
return <li>{props.value}</li>;
}
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
// 맞습니다! 배열 안에 key를 지정해야 합니다.
<ListItem key={number.toString()} value={number} />
);
return (
<ul>
{listItems}
</ul>
);
}
⇒ 대부분 map()
메소드에서 사용되는 컴포넌트에 넣는게 좋다.
각각 다른 리스트라면 key가 같아도 상관 없다. 그리고 key는 컴포넌트로 전달되지 않는다. 전달하고 싶다면 다른 키를 이용해서 전달해야 한다.