배열 메소드 map에서 콜백 함수의 리턴 값으로 리액트 엘리먼트를 리턴하면 됩니다.
import items from './pokemons';
function Pokemon({ item }) {
return (
<div>
No.{item.id} {item.name}
</div>
);
}
function App() {
return (
<ul>
{items.map((item) => (
<li key={item.id}>
<Pokemon item={item} />
</li>
))}
</ul>
);
}
export default App;
참고로 반드시 JSX의 중괄호 안에서 map 함수를 써야 하는 것은 아닙니다.
예를 들어서 아래처럼 renderedItems 라는 변수에 map의 결과를 지정해도 똑같이 렌더링 하게 됩니다. renderedItems 의 계산된 값이 결국 리액트 엘리먼트의 배열이기 때문입니다.
import items from './pokemons';
function Pokemon({ item }) {
return (
<div>
No.{item.id} {item.name}
</div>
);
}
function App() {
const renderedItems = items.map((item) => (
<li key={item.id}>
<Pokemon item={item} />
</li>
));
return (
<ul>
{renderedItems}
</ul>
);
}
export default App;
배열 메소드의 sort 메소드를 사용하면 배열을 정렬할 수 있었죠?
이렇게 정렬한 배열을 렌더링 할 수 있었습니다.
아래 코드는 id 순서대로 / 반대로 정렬하는 예시입니다.
import { useState } from 'react';
import items from './pokemons';
function Pokemon({ item }) {
return (
<div>
No.{item.id} {item.name}
</div>
);
}
function App() {
const [direction, setDirection] = useState(1);
const handleAscClick = () => setDirection(1);
const handleDescClick = () => setDirection(-1);
const sortedItems = items.sort((a, b) => direction * (a.id - b.id));
return (
<div>
<div>
<button onClick={handleAscClick}>도감번호 순서대로</button>
<button onClick={handleDescClick}>도감번호 반대로</button>
</div>
<ul>
{sortedItems.map((item) => (
<li key={item.id}>
<Pokemon item={item} />
</li>
))}
</ul>
</div>
);
}
export default App;
배열 메소드 중 filter 와 배열형 스테이트를 활용하면 삭제 기능을 간단히 구현할 수 있습니다.
import { useState } from 'react';
import mockItems from './pokemons';
function Pokemon({ item, onDelete }) {
const handleDeleteClick = () => onDelete(item.id);
return (
<div>
No.{item.id} {item.name}
<button onClick={handleDeleteClick}>삭제</button>
</div>
);
}
function App() {
const [items, setItems] = useState(mockItems);
const handleDelete = (id) => {
const nextItems = items.filter((item) => item.id !== id);
setItems(nextItems);
};
return (
<ul>
{items.map((item) => (
<li key={item.id}>
<Pokemon item={item} onDelete={handleDelete} />
</li>
))}
</ul>
);
}
export default App;
각 요소를 렌더링 할 때는 key Prop을 내려줘야 하는데요.
이때 가장 바깥쪽에 있는 (최상위) 태그에다가 key Prop을 지정하면 됩니다.
앞에서 id 는 각 요소를 구분할 수 있는 고유한 값이기 때문에 사용했습니다.
반드시 id 일 필요는 없고 포켓몬 이름처럼(참고로 포켓몬 이름은 고유합니다)
각 데이터를 구분할 수 있는 고유한 값이면 무엇이든 key 로 활용해도 상관없습니다.
import items from './pokemons';
function Pokemon({ item }) {
return (
<div>
No.{item.id} {item.name}
</div>
);
}
function App() {
return (
<ul>
{items.map((item) => (
<li key={item.name}>
<Pokemon item={item} />
</li>
))}
</ul>
);
}
export default App;