반응형
📘 『소플의 처음 만난 리액트』를 읽고 정리한 글입니다.
리스트와 키
- 리스트는 같은 유형의 아이템을 순서대로 모아놓은 것이다.
- 리스트를 구현하기 위해 자바스크립트의 변수나 객체를 하나의 변수로 묶어놓은 것을 배열이라고 한다.
- 키는 각 객체나 아이템을 구분할 수 있는 고유한 값을 의미한다.
Map()
- 같은 컴포넌트를 재사용할 때 각 컴포넌트의 내용을 코드상에 하나씩 직접 넣는 것은 비효율적이다.
- 대신 자바스크립트 배열의 map() 함수를 사용하면 된다.
- map() 함수는 배열에 들어있는 각 변수 또는 객체에 어떤 처리를 한 뒤 배열을 리턴한다. 다음은 예제 코드이다.
function NumberList(props) {
const { numbers } = props;
const listItems = numbers.map((number) =>
<li>{number}</li>
);
return (
<ul>{listItems}</ul>
);
}
- 상기 코드를 실행하면 리스트 아이템에는 무조건 키가 있어야 한다는 경고 문구가 나온다. 코드를 개선해보자.
// 1. id 사용
const listItems = numbers.map((number) =>
<li key={number.id}>{number}</li>
);
// 2. map()의 index 사용
const listItems = numbers.map((number, index) =>
<li key={index}>{number}</li>
);
- 리액트에서는 키를 넣어주지 않으면 기본적으로 인덱스 값을 키로 사용한다. 그렇기 때문에 경고 문구를 노출해주는 것.
- 인덱스를 키로 사용하면 아이템의 순서가 바뀔 경우 성능에 영향을 미치고 컴포넌트의 상태 관련 문제를 일으킬 수도 있다.
- 그렇기 때문에 각 요소의 식별 가능한 ID를 키로 사용하는 것이 올바르다.
- 다시 한번 꼭 기억해야할 부분은 map() 함수를 사용할 땐 엘리먼트에 키값을 넣어주어야 한다는 점이다.
실습
// ...
return (
// ...
<TableBody>
{currentPageData.map((member) => (
<TableRow key={member.email} sx={{ height: "30px" }}>
<TableCell sx={{ paddingBottom: "5px", paddingTop: "5px" }}>
{member.leader === member.email ? "👑 " : ""}
{member.name}
</TableCell>
<TableCell sx={{ paddingBottom: "5px", paddingTop: "5px" }}>
{member.email}
</TableCell>
<TableCell sx={{ paddingBottom: "5px", paddingTop: "5px" }}>
{member.description}
</TableCell>
<TableCell sx={{ paddingBottom: "5px", paddingTop: "5px" }}>
<IconButton
color="inherit"
onClick={(event) => handleMenuOpen(event, member)}
>
<MoreVertIcon />
</IconButton>
{/* 드롭다운 메뉴 */}
<Menu
anchorEl={anchorEl}
open={selectedRow === member}
onClose={handleMenuClose}
anchorOrigin={{
vertical: "top",
horizontal: "right",
}}
transformOrigin={{
vertical: "top",
horizontal: "right",
}}
>
<MenuItem onClick={() => updateWorkspace(member)}>
리더 지정
</MenuItem>
<MenuItem onClick={() => removeMemberFromWorkspace(member)}>
추방
</MenuItem>
</Menu>
</TableCell>
</TableRow>
))}
</TableBody>
// ...
);
};
// ...
- 참고로 책에서 제공하는 실습 코드가 아니라 작성자의 토이 프로젝트에서 가져온 코드 일부분이다.
- 성능 문제를 방지하기 위해 키를 인덱스가 아닌 각 멤버의 이메일로 두었다.
이미지 출처
[React] Component 를 사용하는 기본적인 방법
컴포넌트는 React의 핵심 개념 중 하나이며, 이는 사용자 인터페이스(UI)를 구축하는 기반이다. 컴포넌트를 만들어보자. 우선 여기까지는 순수 JS의 선언 및 정의에 대한 구문이다. 리액트는 컴포
velog.io
소플 - soaple.io
소플
www.soaple.io
'개발 > 리액트' 카테고리의 다른 글
리액트 핵심만 훑어보자 #13 컴포넌트 간 상태 공유 (1) | 2025.03.11 |
---|---|
리액트 핵심만 훑어보자 #12 폼 (1) | 2025.03.09 |
리액트 핵심만 훑어보자 #10 조건부 렌더링 (0) | 2025.03.07 |
리액트에서 API 호출 URL을 환경 변수로 설정하자 (0) | 2025.02.23 |
리액트 - 화면 개발(feat.Material UI) (8) | 2025.01.29 |