데이터 처리와 출력을 분리하여 코드를 작성
코드의 가독성 증가 & 재사용성 향상
어떻게 동작하는지, 어떤 로직을 수행하는지에 관련있다.
비즈니스 로직, 상태 등을 모아 놓는다.
Container에서 처리한 상태를 props로 전달받아 상태를 화면에 출력하는 컴포넌트.
import React, { useState, useEffect } from 'react';
import ClubList from './ClubList';
import { getDatas, searchDatas } from 'apis/clublist';
import getToken from 'utils/getToken';
const ClubListContainer = () => {
const [clubData, setClubData] = useState([]);
const [originData, setOriginData] = useState([]);
const filterCategory= (element) => {
const searchData = originData.filter((el) => el.category === element);
if (element === '전체') setClubData(originData);
else setClubData(searchData);
};
const searchCategory = async (data) => {
await searchDatas(data).then((response) => {
if (response.data.clubs.length === 0) {
alert('검색결과가 없습니다');
return;
}
setClubData(response.data.clubs);
});
};
const getData = async () => {
try {
const response = await getDatas();
setClubData(response.data.result);
setOriginData(response.data.result);
} catch (e) {
alert(e);
}
};
const moveToClubHome= () => {
if (!getToken()) alert('로그인 후 이용해주세요.');
else router.push(`/clubhome/${clubNo}`);
};
useEffect(() => {
getData();
}, []);
return (
<ClubList
clubData={clubData}
originData={originData}
filterCategory={filterCategory}
searchCategory={searchCategory}
moveToClubHome={moveToClubHome}
/>
);
};
export default ClubListContainer;
import React from 'react';
import TypeSearch from './TypeSearch';
import styles from 'styles/Club/Lists/ClubLists.module.scss';
import ClubListItem from './ClubList';
const ClubList = ({ clubData, filterCategory, searchCategory, moveToClubHome}) => {
return (
<>
<TypeSearch filterCategory={filterCategory} searchCategory={searchCategory} />
<div className={styles.container}>
<div className={styles.activities}>
{clubData.map((club) => {
return (
<ClubListItem
img={club.logoUrl}
title={club.name}
categories={club.category}
key={club.no}
clubNo={club.no}
clubName={club.name}
onClick={moveToClubHome}
/>
);
})}
</div>
</div>
</>
);
};
export default ClubList;