TimelineListItem
컴포넌트에 각각 다른 데이터 넣기.TimelineList
TimelineListItem
리액트에서는 state 내부의 값을 직접적으로 수정하면 안 된다. 이를 불변성 유지라고 한다.
push, splice, pop 같은 내장함수는 배열 자체를 직접 수정하게 되므로 불변성 유지 원칙에 적합하지 않다. 그 대신에, 기존의 배열에 기반하여 새 배열을 만들어내는 함수인 concat, slice, map
, filter 같은 함수를 사용해야한다고 한다.
map()
메서드는 callback
함수를 각각의 요소에 대해 한번씩 순서대로 불러 그 함수의 반환값으로 새로운 배열을 만든다.
주의 :
callback
함수는 배열 값이 들어있는 인덱스에 대해서만 호출된다. 즉, 값이 삭제되거나 아직 값이 할당/정의되지 않은 인덱스에 대해서는 호출되지 않기 때문에 값을 꼭 초기화해두자.
const dataSet = [{
name : 'daelee',
age : '24'},
{
name : 'secho',
age : '27'}];
dataSet.map(obj => obj.name = 'taelee');
console.log(dataSet[0].name);
> "taelee"
더 다양한 예제는 여기 참고.
arr.map(callback(currentValue[, index[, array]])[, thisArg])
currentValue
: 처리할 현재 요소.index
: 처리할 현재 요소의 인덱스.array
: map()
을 호출한 배열. <- 어떤 용도인지 잘 이해안됨. 그냥 써두는건가?배열의 각 요소에 대해 실행한 callback
의 결과를 모은 새로운 배열.
export function TimelineList() {
const dataList = [
{
title: "-",
status: "-",
content: "-",
date: "-"
},
{
title: "-",
status: "-",
content: "-",
date: "-"
},
{
title: "-",
status: "-",
content: "-",
date: "-"
},
{
title: "-",
status: "-",
content: "-",
date: "-"
},
{
title: "-",
status: "-",
content: "-",
date: "-"
},
{
title: "-",
status: "-",
content: "-",
date: "-"
},
]
return (
<>
{dataList.map((v, idx) => <TimelineListItem data={v} key={idx}/>)}
</>
)
}
dataList
라는 더미데이터 배열을 만든다. 프론트에서 여기까지 해놔야 서버에서 어떤 데이터를 가져올지 감을 잡을 수 있다.
{dataList.map((v, idx) => <TimelineListItem data={v} key={idx}/>)}
모든 dataList
에 map()
을 적용한 TimelineListItem
을 반환한다.
v
에는 아래 배열 하나하나, 총 6개의 배열이 리스트로 담긴다.
{
title: "2차",
status: "모집중",
content: "온라인 코딩테스트",
date: "7. 4."
},
TimelineListItem
에 v
를 data
로, idx
를 key
로 담아 보낸다.
export function TimelineListItem ({data}) {
return (
<li className={styles.list}>
<div className={classNames({[styles.card]: true, [styles.card_edu]: true})}>
{data.title}
<span className={styles[data.status]}></span>
<div className={styles.content}>{data.content}</div>
<div>{data.date}</div>
</div>
</li>
)
}
data
state의 값들로 바꿔주었다.export default function HorizontalTimeline() {
return (
<div className={styles.body}>
<Header className={styles.header}>
<h1>네이버 부스트캠프</h1>
<p>개발자의 지속 가능한 성장을 추구하는 학습 커뮤니티</p>
</Header>
<div className={styles.line}></div>
<div className={styles.timeline}>
<TimeLineList />
</div>
</div>
);
}
<TimeLineList />
를 단 한번 호출하는 것만으로 총 6개의 타임라인 리스트 아이템이 렌더링된다.
아래 원래 HorizontalTimeline
코드와 비교해보면 얼마나 코드가
구조화되고, 깔끔해졌고, 리액트스러워졌는지 알 수 있다...!
export default function HorizontalTimeline() {
return (
<div className={styles.body}>
<Header className={styles.header}>
<h1>네이버 부스트캠프</h1>
<p>개발자의 지속 가능한 성장을 추구하는 학습 커뮤니티</p>
</Header>
<div className={styles.line}></div>
<div className={styles.timeline}>
<ol className={styles.order}>
<li className={styles.list}>
<div className={classNames({[styles.card]: true, [styles.card_end]: true})}>
접수기간<span className={styles.status_end}>마감</span><div className={styles.content}>6.1 11:00 ~ 6.30 23:59</div>
</div>
</li>
<li className={styles.list}>
<div className={classNames({[styles.card]: true, [styles.card_end]: true})}>
1차<span className={styles.status_end}>마감</span><div className={styles.content}>온라인 코딩테스트<br/>7.4</div>
</div>
</li>
<li className={styles.list}>
<div className={classNames({[styles.card]: true, [styles.card_now]: true})}>
2차<span className={styles.status}>모집중</span><div className={styles.content}>온라인 코딩테스트<br/>7.4</div>
</div>
</li>
<li className={styles.list}>
<div className={classNames({[styles.card]: true, [styles.card_now]: true})}>
최종 합격자 발표<span className={styles.status}>모집중</span><div className={styles.content}>수료자 선발<br/>7.20</div>
</div>
</li>
<li className={styles.list}>
<div className={classNames({[styles.card]: true, [styles.card_edu]: true})}>
부스트캠프 챌린지<span className={styles.status_edu}>D-43</span><div className={styles.content}>수료자 선발<br/>7.27 ~ 8.21</div>
</div>
</li>
<li className={styles.list}>
<div className={classNames({[styles.card]: true, [styles.card_edu]: true})}>
부스트캠프 멤버쉽<span className={styles.status_edu}>D-55</span><div className={styles.content}>챌린지 과정 수료자만<br/>8.31 ~ 12.21</div>
</div>
</li>
<li>
</li>
</ol>
</div>
</div>
);
}
ol
, li
같은 리스트 태그들. 무조건 컴포넌트가 될 녀석들이다.