본문 바로가기

개발 이야기

[마이리얼트립] Hook 이용하여 반복 리스트 컴포넌트화(배열)

안녕하세요. 이제 막 기획자로 시작한 아기 기획자 소소한G 입니다.

비전공자 출신으로 IT 웹 기획자로서 살아남기 위해 일주일에 두번 프로트엔드 개발 수업을 듣고 있어요.

온전히 비전공자의 시선으로 꼼꼼하게, 원초적으로 설명드리려고 합니다.

저처럼 초보자 웰컴이에용.

 

앞의 포스팅에 이어, Hook을 이용하여,

함수형 컴포넌트를 사용하면서 마이리얼트립에서 반복되고 재 사용될 부분을

연속적으로 리스트를 가지고 있고 이를 하나의 배열로 가지고 오는 상태로 컴포넌트화 시켜볼거에요.


State Hook을 사용한 앞의 포스팅은 아래 링크에서 참고해주세요.

https://hjp-recipe.tistory.com/38?category=835412 

 

[마이리얼트립] State Hook을 사용하기(+컴포넌트화)

안녕하세요. 이제 막 기획자로 시작한 아기 기획자 소소한G 입니다. 비전공자 출신으로 IT 웹 기획자로서 살아남기 위해 일주일에 두번 프로트엔드 개발 수업을 듣고 있어요. 온전히 비전공자

hjp-recipe.tistory.com


컴포넌트 (components)란?

가장 작은 영역(단위)로
나중에도 재사용할 수 있도록
그 영역만 따로 제작해두고 

페이지를 만들 때 필요한 컴포넌트를 불러와 연결할 수 있다.

 

 

- 컴포넌트 생성하는 법 -

컴포넌트로 만들 영역의 이름으로 폴더 생성 (이 때, 폴더 이름의 첫 글자는 대문자!)

폴더 안에 index.jsx, index.css(scss) 등 필요한 파일 생성한다. 

(파일의 이름은 index 로 한다.)

 


페이지에서 반복되고 재사용이 가능할 것 같은 부분을 찾아보자.

아래 이미지의 빨간 박스 안의 카드들은 이 영역에 동일한 레이아웃을 여러개의 객체가 가지고 있기 때문에 컴포넌트화 시킬 수 있다.

 

 

 

> 1. 이 부분을 Card 컴포넌트

 

 

 

 

 

 

> 2. 이 부분을 AdvertisementCard 컴포넌트

 

 

 

 

 

 

 

 

 

 

 

 


1. Card 컴포넌트 만들기

 

[Card 컴포넌트에 코드 잘라 붙여넣기]

 

components폴더 속에 Card 컴포넌트를 생성하고 그 속에 jsx파일, scss파일을 생성한다.

 

 

Home 컴포넌트에서 짜 둔 body 구조를 잘라

index.jsx에 붙여온다.

 

 

 

 

 

 

 

 

 

그리고 card 영역만 잘라서 Card의 return 구문에 작성해준다. 

 

 


 

[Card에 가져올 데이터 연결하기]

 

카드의 레이아웃은 반복되지만 카드마다 text와 image가 모두 다르다. 

그래서 text, image데이터를 받아오기 위해 Card 함수의 매개변수에 text, image를 작성해준다. 

**데이터를 받는 것이기 때문에 { } 중괄호 안에 작성해 주어야 한다. 

parameter에 받아온 데이터는 return 구문에 작성하여 출력되어야 한다. 

그래서 style의 직접입력방식으로 backgroundImage: `url( ${image} )`  를 작성한다. 

이 때 배열에서 데이터를 받아오는 것이기 때문에 백틱` `  속에 ${ } 에 데이터인  image를 작성한다. 

<span></span>태그 부분은 도시의 이름을 작성하기 때문에 { } 데이터를 받아오는 중괄호 속에 text를 작성해 준다. 

*** Hook을 사용한 함수형 컴포넌트에서 state를 가져올 때는 바로 {text} 를 하여 가져올 수 있다.

 


 

[반복문으로 sliding-card 만들기_Home/index.jsx _ 상태 작성하기]

 

앞의 포스팅에서 말한 Hook를 사용하여 state의 Card컴포넌트에 사용할 text, image의 데이터들을 작성해 줄 것이다.

> Hook을 사용하기 위한 기본 설정

> 상태값 사용하기

이 때 변수명은 cities, 해당 변수를 갱신할 수 있는 함수 이름은 setCities(적용할 함수 이름)라고 설정한다. 

useState ( ) 속에 배열 속에 데이터를 주입할 것이다. 

useState는 상태를 사용한다는 뜻이다. name (도시이름), image (이미지 주소) 로 작성한다. 

 

> createCities 함수 _ 반복문 

 

parameter(매개변수) 에는 상태에 작성한 배열을 받아야 하기 때문에 배열을 나타내는 arr을 주입한다.

 

sliding-card 안의 각 카드인 <li></li> 태그를 반복해주기 위하여 map 함수에 넣어준다. 

 

Card 컴포넌트를 연결해준 후 앞서 Card 컴포넌트에서 작성한 Card함수의 parameter에 작성해준 text, image의 데이터를 받아오기 위해 아래와 같이 작성한다. 

text={city.name}

image={city.image}

city는 map 함수의 매개변수에 city라는 이름으로 받아왔기 때문에 city.name   city.image로 작성해준 것이다. 

 


 

[Home 컴포넌트에서 sliding-card 상태 호출하기]

 

Home 컴포넌트의 return 구문 안에 sliding-card 태그 속에 상태를 불러온다.

Home 컴포넌트의 태그 return 내보내기 부분

 

sliding-card라는 이름의 div 태그 속에 작성하는데, 데이터를 가지고 오기 때문에 { } 안에 작성한다.

cities는 상태의 변수명 cities를 뜻한다. 

createCities의 함수를 호출하고 cities의 배열 데이터를 주입하여 map 함수로 완성한다.

 


2. AdvertisementCard 컴포넌트 만들기

 

[Card 컴포넌트에 코드 잘라 붙여넣기]

 

components폴더 속에 Advertisement 컴포넌트를 생성하고,

그 속에 jsx파일, scss파일을 생성한다.

 

 

Home컴포넌트에서 반복시킬 컴포넌트인 advertisement-container 이름의 div 태그만 잘라 

AdvertisementCard 컴포넌트의 index.jsx에 분리해 준다. 

 


 

[AdvertisementCard에 가져올 데이터 연결하기]

 

 

여기서도 카드들의 레이아웃은 모두 같지만

이미지, 텍스트의 내용을 모두 다르게 작성해야 한다. 

 

 

 

 

 

 

 

 

 

카드의 레이아웃은 반복되지만 카드마다 text와 image가 모두 다르게 작성되어야 한다. 

빨간색 박스로 나눈 것처럼 데이터가 4가지인 것을 확인할 수 있다. 

 

그래서 text, image등의 데이터를 받아오기 위해 AdvertisementCard 함수의 매개변수에 image, title, breadcrumb, cost를 작성해준다. 

** 마찬가지로 데이터를 받는 것이기 때문에 { } 중괄호 안에 작성해 주어야 한다. 

 

 

parameter에 받아온 데이터는 return 구문에 작성하여 출력되어야 한다. 

각 데이터를 받아와야 하는 태그 속에 { } 데이터를 받아오는 중괄호 속에 image, breadcrumb, title, cost를 작성해 준다. 

*** Hook을 사용한 함수형 컴포넌트에서 state를 가져올 때는 바로 {image} {breadcrumb} {title} {cost}를 하여 가져올 수 있다.

 

> 상태값 사용하기

이 때 변수명은 advertisement, 해당 변수를 갱신할 수 있는 함수 이름은 setAdevertisement(적용할 함수 이름)라고 설정한다. 

 

 

advertisement 에서는 '겨울에도 꿀잼보장' 이라는 타이틀도 함께 포함되기 때문에

객체를 사용하여 객체 속에 배열을 담는다. 

 

> createAdvertisement함수 _ 반복문

 

 

 

parameter(매개변수) 에는 상태에 작성한 배열을 받아야 하기 때문에 배열을 나타내는 obj 주입한다.

 

advertisment-wrapper 안의 각 카드인 <li></li> 태그를 반복해주기 위하여 map 함수에 넣어준다.

 

 

Card 컴포넌트를 연결해준 후 앞서 AdvertisementCard 컴포넌트에서 작성한 AdvertisementCard함수의 parameter에 작성해준 image, title, breadcrumb, cost의 데이터를 받아오기 위해 아래와 같이 작성한다.

{obj.title}

image={advertisement.image}

title={advertisement.title}

breadcrumb={advertisment.breadcrumb}

cost={advertisement.cost}

advertisement는 map 함수의 매개변수에 advertisement라는 이름으로 받아왔기 때문에 advertisement.image  advertisement.title  advertisement.breadcrumb  advertisement.cost로 작성해준 것이다. 

 

객체의 title 불러오기

 

배열의 데이터 불러오기

 


 

[Home 컴포넌트에서 createAdvertisement상태 호출하기]

 

 

Home 컴포넌트의 return 구문 안에 createAdvertisement태그 속에 상태를 불러온다.

 

Home 컴포넌트의 태그 return 내보내기 부분

 

advertisement2 도 advertisement 와 같은 방법으로 하면 된다!

 

반응형