리스트 객체를 순회하며 차례대로 화면에 랜더링하기
- 일기 객체를 보여줄 DiaryList 컴포넌트 생성 및 export
& app.js 에서 import
const DiaryList = () => {
return (
<div className="DiaryList">
<h2>일기 리스트</h2>
</div>
);
};
export default DiaryList;
import DiaryList from "./DiaryList";
function App() {
return (
<div className="App">
<DiaryEditor />
<DiaryList />
</div>
);
}
- 일기 리스트(dummy)를 DiaryList 컴포넌트에 props로 전달
const dummyList = [
{
id: 1,
author: "조성원",
content: "내용1",
emotion: 3,
created_date: new Date().getTime(),
},
...
{
id: 4,
author: "아빠",
content: "내용4",
emotion: 1,
created_date: new Date().getTime(),
},
];
function App() {
return (
<div className="App">
<DiaryEditor />
{}
<DiaryList dummyList={dummyList} />
</div>
);
}
- DiaryList.js에서 dummyList prop 전달받기
const DiaryList = ({ dummyList }) => {
console.log(dummyList);
return (
<div className="DiaryList">
<h2>일기 리스트</h2>
<div>일기 개수 : {dummyList.length}</div>
</div>
);
};
export default DiaryList;
map 함수 사용해서 리스트 객체 순회하며 랜더링
const DiaryList = ({ dummyList }) => {
console.log(dummyList);
return (
<div className="DiaryList">
<h2>일기 리스트</h2>
<div>일기 개수 : {dummyList.length}</div>
<div>
{dummyList.map((lst) => (
<div>
<div>작성자 : {lst.author}</div>
<div>내용 : {lst.content}</div>
<div>감정 : {lst.emotion}</div>
<div>작성시간 : {lst.created_date}</div>
</div>
))}
</div>
</div>
);
};
export default DiaryList;
- map함수 사용법
exList.map(lst => func());
순회할 전체 리스트.map(리스트의 각 요소 => 각 요소로 수행할 func());
const array1 = [1, 4, 9, 16];
const map1 = array1.map(x => x * 2);
console.log(map1);
- 주의 : map 함수 사용 시 리스트에 있는 각각 자식요소들은 반드시 고유한 key prop을 받아야함
- 자식요소에 key값으로 사용할 수 있는 고유한 값이 없다면, map의 두 번 째 요소인 idx 사용 가능
- 단, 배열 요소에 변경이 있을 경우(수정, 삭제, 추가 등) react에서 문제가 생길 수 있음

const DiaryList = ({ dummyList }) => {
console.log(dummyList);
return (
<div className="DiaryList">
<h2>일기 리스트</h2>
<div>일기 개수 : {dummyList.length}</div>
<div>
{dummyList.map((lst) => (
<div key={lst.id}>
<div>작성자 : {lst.author}</div>
<div>내용 : {lst.content}</div>
<div>감정 : {lst.emotion}</div>
<div>작성시간 : {lst.created_date}</div>
</div>
))}
</div>
</div>
);
};
<div>
{dummyList.map((lst, idx) => (
<div key={lst.idx}>
<div>작성자 : {lst.author}</div>
<div>내용 : {lst.content}</div>
<div>감정 : {lst.emotion}</div>
<div>작성시간 : {lst.created_date}</div>
</div>
))}
</div>
- 주의 : dummyList가 undefined로 전달될경우
DiaryList.defaultProps = {
dummyList: [],
};
- 일기 영역을 DiaryItem.js 컴포넌트로 분리
- DiaryList.js 자체로 다이어리 전체 내용을 전달하려면 해당 js안에 랜더링, 수정, 삭제 등 모든 요소가 포함되어 있어야함.
- 한 페이지에 너무 많은 내용을 담지 않기 위해 일기 본문을 랜더링 하는 컴포넌트 분리
import DiaryItem from "./DiaryItem";
const DiaryList = ({ dummyList }) => {
dummyList.map((lst) => {
console.log(lst);
});
return (
<div className="DiaryList">
<h2>일기 리스트</h2>
<div>일기 개수 : {dummyList.length}</div>
<div>
{dummyList.map((lst, idx) => (
<DiaryItem key={lst.id} {...lst} />
))}
</div>
</div>
);
};
DiaryList.defaultProps = {
dummyList: [],
};
export default DiaryList;
- map 함수 내에서 순회되는 각 lst는 아래와 같음
- {...lst}를 사용하면 배열의 모든 요소를 한 번에 전달할 수 있음.

const DiaryItem = ({ author, content, emotion, created_date, id }) => {
return (
<div className="diaryItem">
<div className="info">
<div>
작성자 : {author} | 감정 : {emotion}
</div>
{}
<br />
<div className="date">
작성시간 : {new Date(created_date).toLocaleString()}
</div>
<div>내용 : {content}</div>
</div>
</div>
);
};
export default DiaryItem;