querystring 적용해서 filtering 구현하기🙏🏼
1차 프로젝트 때는 순수 프론트에서 가격 별, 색상 별, 카테고리 별 정렬하는 부분을 구현했는데, 2차 때는 backend에 query string으로 소통해서 filtering을 구현하기로 하였다!
fetch함수에 백엔드에 필요한 쿼리스트링을 보내줘야 하는데, 페이지, 가격 range검색, 숙소 타입을 순서에 상관없이 클릭해서 적용해야 하고, 하나만 선택할 수도, 모든 걸 선택할수도 있다는 걸 고려해야 하고 함수를 짜야한다.
useState로 기본 값을 아래와 같이 filter로 설정해주었다.
const [filters, setFilters] = useState({
page: '',
stay_type: '',
price: '',
});
onClick
이벤트 (pageHandler) 함수의 인자로 페이지 num
을 넘겨준다. <button onClick={() => pageHandler(1)}>1</button>
num
을 setPage
값으로 주고, 동시에 쿼리에 맞게 적용한다. const pageHandler = async (num) => {
applyFilter('page', num);
setPage(num);
};
type
인 page
와 num
을 인자로 받아 쿼리스트링에 붙일 내용을 생성해준다. 해당의 경우 type을 'page'로 num 을 '1'로 받았으므로,&page=${1}
로 만들어 주었다. const applyFilter = (type, num) => {
let val;
if (type === 'page') val = `&page=${num}`;
else if (type === 'stay_type') val = `&stay_type=${stay_type}`;
else if (type === 'price') val = `&price=${lowPrice}~${highPrice}`;
const updatedFilters = { ...filters, [type]: val };
setFilters(updatedFilters);
};
const filters = {
page: '1',
stay_type: '',
price: '',
};
useEffect(() => {
let newQs = '';
const keys = Object.keys(filters);
const filteredKeys = keys.filter((key) => filters[key]);
filteredKeys.forEach((key) => (newQs += filters[key]));
setQs(newQs);
}, [filters]);
qs 가 업데이트 될때마다 fetch함수를 만들어 주는데, 이후에 필요한 부분을 querystring으로 넘겨주는 방식이라고 생각하면 된다.
prevLoc의 경우 이전 페이지에서 넘겨주는 특정 querystring이 있어서 변수로 지정해서 특정 값이 들어오게 붙인 형태이다.
useEffect(() => {
history.push(`/stay${prevLoc}${qs}`);
fetch(`${API_URL_CH}/stay${prevLoc}${qs}`)
.then((res) => res.json())
.then((res) => setData(res.stay_list));
}, [qs]);
const applyFilter = (type, num) => {
let val;
if (type === 'page') val = `&page=${num}`;
else if (type === 'stay_type') val = `&stay_type=${stay_type}`;
else if (type === 'price') val = `&price=${lowPrice}~${highPrice}`;
const updatedFilters = { ...filters, [type]: val };
setFilters(updatedFilters);
};
onChange={(e) => inputHandler(e, setIsStayTypeChecked, '전체')}
const inputHandler = (e, set, val) => {
const target = e.target;
const { type, checked } = target;
const value = type === 'checkbox' ? checked : value;
set(value);
setStayType(val);
};