[main Project] 15일차 리뷰 (09.21 ~ 09.26)
15일차 리뷰 (09.21 ~ 09.26)
✅ 새로 알게 된 점 1 : useDetectClose
- 활용이 정말 많이 되는 커스텀 훅이다
- 메인페이지 헤더 메뉴, 필터 셀렉터, 검색 자동완성 등에서 활용되었다.
[ 사용 방법 ]
- import 해주고
const [isOpen, ref, handleOpen] = useDetectClose(false)- 남겨져있어야 하는 부분에 ref를 달아준다!
→ 필터 셀렉터 같은 경우, 필터 선택시 닫아져버리는 경우가 있었는데 그럴 경우 open btn + 필터 셀렉트 부분을 하나의 div로 감싸서 그 div에 ref 를 달아주면 된다.
import { useEffect, useState, useRef } from "react";
const useDetectClose = (initialState) => {
const [isOpen, setIsOpen] = useState(initialState);
const ref = useRef(null);
const handleOpen = () => {
setIsOpen(!isOpen);
};
useEffect(() => {
// ref 값이 널이 아니거나 현재값에 포함되어있지 않으면 상태를 바꿔준다
const onClick = (e) => {
if (ref.current !== null && !ref.current.contains(e.target)) {
setIsOpen(!isOpen);
}
};
if (isOpen) window.addEventListener("click", onClick);
return () => window.removeEventListener("click", onClick);
}, [isOpen]);
return [isOpen, ref, handleOpen, setIsOpen];
};
export default useDetectClose;
✅ 새로 알게 된 점 2 : SWR 활용하기
- Data fetching을 hooks로 빼서 관리하고싶었지만 같은 코드지만 swr 에서 파라미터로 엔드포인트를 받는 방법을 몰라서 고민이 됐다. 🤔
- 멘토링을 통해 성콩!
[ 활용 방법 ]
- 받아온 파라미터를 axios 부분이 아닌
useSWR(${url}, fetcher)이 부분에 해주어야 한다. - axios.get 부분의 URL end-point 가 useSWR의 키값 (${url} 부분)과 동일해야한다.!!!
const BASE_URL = `${import.meta.env.VITE_BASE_URL}`;
export const useGetPlace = (url) => {
const fetcher = async (innerURL) => {
const res = await axios.get(`${BASE_URL}${innerURL}`);
return res.data;
};
const { data, error } = useSWR(`${url}`, fetcher);
return {
data: data,
isLoading: !error && !data,
isError: error,
};
};
import { useGetPlace } from "../hooks/useAPI";
// URL은 변하는 값으로 카테고리 별로 데이터를 받기 위해 사용되었다
const URL = `/api/v1/place/category/all?page=${pageInfo}&size=8`;
const { data, isLoading, isError } = useGetPlace(URL);
👍 잘한 점
- 전역으로 상태관리를 하니 코드도 깔끔하고 props이 헷갈리는 일이 확실히 줄었다!
- hooks를 만들고 사용하게 되었다👍
- 마이페이지 제작 시 메뉴에 따른 데이터를 따로 호출해야했었다. 같은 컴포넌트 내에 다른 API 호출을 고민했었는데 메뉴를 상태관리하고 클릭한 메뉴를 담아준다. 메뉴별 API를 호출하게 구현했더니 성공했다!
- 마이페이지 반응형도 같이 진행했다 굳굳
🥲 아쉬운 점
- 테스트가 미뤄지는 점,,,,
🚀 추가적으로
- hooks 로 뺄 수 있는 부분에 대해 고민해보기!
- 마이페이지 이미지 부분에 대해 고민해봐야겠당
- 데이터 없을 때 컴포넌트를 하나