간단한 과제 소개
- todoList 형태의 메달(금, 은, 동) 데이터 관리 페이지
- 국가 및 메달 개수 입력 가능
- 입력한 국가별 메달 현황 확인
- 입력, 삭제, 수정, 정렬
페이지 레이아웃은 위와 같다. 상단에 데이터를 입력, 수정할 수 있는 폼이 있고 하단에 테이블 형태로 list를 확인할 수 있다. list 영역에서 반복가능한 데이터는 크게 2가지가 있다. 첫 번째는 헤더 부분 "국가명 금 은 동 액션"이 있고 두 번째는 각 나라별 데이터 목록이다. 우선 두 번째 데이터 목록 부분부터 어떻게 반복시킬수 있을지 살펴 보자.
💡 행 반복 + 열 반복 - Object.values()
데이터 한 줄 한 줄이( "미국 132 0 0 버튼" ) 하나의 행이다. 전체 데이터 구조는 배열내의 객체들로 이루어져 있다.
countries = [
{
name: '미국',
gold: 132,
silver: 0,
bronze: 0,
},
{
name: '대한민국',
gold: 123,
silver: 1,
bronze: 44,
},
]
위와 같이 데이터가 추가된다고 할 때 행을 반복문으로 출력하는 것은 필수이다.
countries.map(country => {
return <div className='info-box'>
<p>{country.name}</p>
</div>
<div className='info-box'>
<p>{country.gold}</p>
</div>
<div className='info-box'>
<p>{country.silver}</p>
</div>
<div className='info-box'>
<p>{country.bronze}</p>
</div>
/* 이하 생략 */
이렇게 작성하면 `countries`안의 객체를 한 줄씩 반복하면서 처리되게 된다. 하지만 위의 코드를 살펴보면 또 다르게 반복할 수 있는 코드가 보인다. `<p>` 태그 안의 내용을 제외하면 그 외의 코드는 전부 동일하다. `<p>` 태그의 내용도 반복 시킬 수 있을 것 같다. 이 때 `Object.values()`를 사용하면 객체안의 `값` 들만 배열로 변환시켜준다.
예를 들어 아래와 같은 데이터가 있다고 가정해보자.
contry = {
name: '미국',
gold: 132,
silver: 0,
bronze: 0,
}
위의 `country` 객체를 `Object.values(contry)` 를 이용해서 배열로 변환하면 아래처럼 변환시켜준다.
['미국', 132, 0, 0]
이제 위의 변환 된 데이터를 이용해서 반복시켜보자.
{countries.map(country => {
return <div className='country-container'>
{
Object.values(country).map((item, index) => {
return (
<div key={index} className='info-box'>
<p>{item}</p>
</div>
)
})
}
/* 이하 생략 */
- `contries(국가별 행 데이터)` 를 map으로 반복시켜 `country` 객체로 데이터를 뽑아쓸 수 있다.
- 뽑아낸 `country` 객체의 `값`들을 다시 한 번 배열로 변환하고 `item` 변수로 데이터를 사용한다.
💡 Object.keys()
리스트의 헤더 부분도 한번 살펴보자.
<div className="header-box"><h4>국가명</h4></div>
<div className="header-box"><h4>금</h4></div>
<div className="header-box"><h4>은</h4></div>
<div className="header-box"><h4>동</h4></div>
<div className="header-box"><h4>액션</h4></div>
마찬가지로 `<h4>` 태그 안의 텍스트를 제외하면 전부 동일하다. 반복할 수 있는 여러가지 방법이 있겠지만 `Object.keys()` 를 사용해보고자 객체를 통해 반복하기로 했다.
const headerTitle = {
name: '국가명',
gold: '금',
silver: '은',
bronze: '동',
action: '액션',
}
`headerTitle` 객체를 생성했다. `Object.keys()` 를 통해 반복하게 되면 다음과 같은 배열로 변환 된다.
['name', 'gold', 'silver' ...]
이제 map을 이용해 반복하면서 headerTitle['key'] 와 같은 형태로 꺼내 쓰면 된다.
Object.keys(headerTitle).map((item, index) => {
return <div key={index} className="header-box"><h4>{headerTitle[item]}</h4></div>
})
사실 이렇게 단순한 반복을 객체로 만들어서 할 필요는 없지만 메서드에 익숙해져보고자 사용해보았다.
'프로젝트 > 개인프로젝트' 카테고리의 다른 글
[테일윈드 클래스 변경] - 개인 프로젝트 (LOL) #리팩토링 ⚙️ (0) | 2024.11.01 |
---|---|
🚨 [잘못된 Props 전달] - 개인 프로젝트 (LOL) #Next.js #문제 해결 (0) | 2024.10.23 |
[styled-components ] 깔끔한 조건처리 - #리액트 2차 개인과제 리팩토링 (0) | 2024.09.11 |
[prop drilling 해소] - useContext #리액트 2차 개인과제 리팩토링 (0) | 2024.09.09 |
[강제로 배열길이 늘리기] - Array.prototype.fill #리액트 2차 개인과제 (0) | 2024.09.06 |