react에서 key는 항목을 변경, 추가, 삭제할지 식별할 때 사용된다.
key는 배열 내부 엘리먼트에 지정해야 한다.
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
<li key={number.toString()}>
{number}
</li>
);
key는 해당 항목을 고유하게 식별할 수 있는 문자열을 사용하는게 가장 좋다.
대부분 데이터 id를 key로 사용한다.
문자열을 사용 할 수 없다면, index를 사용할 수 있다.
다만 항목의 순서가 바뀔 수 있는 경우에는 index는 권장하지 않는다.
List에 key를 따로 명시하지 않으면 기본적으로 index를 key로 사용한다.
key는 < li > 엘리먼트에 직접적으로 지정하는게 아니라, 엘리먼트의 함수를 사용하는 태그에서 지정한다.
function ListItem(props) {
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>
);
}
const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
<NumberList numbers={numbers} />,
document.getElementById('root')
);
key는 const, let 안에서 내부 배열이 아니라면 중복에서 사용해도 무방하다.
(다만 헷깔릴듯 하니 중복하지 말자)
function Blog(props) {
const sidebar = (
<ul>
{props.posts.map((post) =>
<li key={post.id}>
{post.title}
</li>
)}
</ul>
);
const content = props.posts.map((post) =>
<div key={post.id}>
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
);
return (
<div>
{sidebar}
<hr />
{content}
</div>
);
}
const posts = [
{id: 1, title: 'Hello World', content: 'Welcome to learning React!'},
{id: 2, title: 'Installation', content: 'You can install React from npm.'}
];
ReactDOM.render(
<Blog posts={posts} />,
document.getElementById('root')
);
같은 함수 안이어도, 기능이 다른 변수라면 key는 중복되어도 무방하다.
const content = posts.map((post) =>
<Post
key={post.id}
id={post.id}
title={post.title} />
);
post에 key를 담아 content에 초기화한다.
function NumberList(props) {
const numbers = props.numbers;
return (
<ul>
{numbers.map((number) =>
<ListItem key={number.toString()}
value={number} />
)}
</ul>
);
}
코드는 깔끔해지지만 남발하면 좋지 않다. map함수가 중첩되면 컴포넌트로 추출하는 것이 좋다.
(https://developer.mozilla.org/ko/docs/Web/API/HTML_Drag_and_Drop_API)