Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- SCSS use
- Spacer
- vuex map
- 쌓임맥락
- flex
- vue mixin
- SCSS forward
- react next
- SCSS import
- vue 이벤트 수신
- 프로그래머스 데브코스
- intersection opserver
- git 같은계정 다른 컴퓨터
- 이벤트 수식어
- 고양이 사진 검색기
- postcss
- nextjs사용법
- 다른컴퓨터에서 git사용
- KDT 프로그래머스 데브코스 프론트엔드
- 리액트
- 리스트 렌더링
- SCSS extend
- vue 지역 컴포넌트
- 프로그래머스 K_Digital Training
- KDT 프로그래머스
- 폼 입력 바인딩
- 프로그래머스 프론트엔드 데브코스
- Vue
- netlify redirect
- 프로그래머스 데브코스 프론트엔드
Archives
- Today
- Total
혼자 적어보는 노트
데브코스 최종 프로젝트 - 17~18일차 본문
17~18일차 - API 연결
API연결을 중점적으로 하고 날짜데이터 변경 및 자잘한 CSS style을 수정했다.
DetailSidebar 구현에 대한 고민,,
코스 상세페이지와 장소 상세페이지에는 좋아요/북마크/공유하기의 기능이 들어있는 동일한 Sidebar가 들어가는데
Sidebar에 해당하는 state를 페이지 단에서 관리를 하게 되면
각 페이지마다 likes, bookmarks에 대한 state를 관리해주어야 한다.
그리고 관련된 로직을 page 컴포넌트 안에 동일하게 중복적으로 작성을 해주어야 하는데
이 부분에 대한 고민을 하게 되었다.
✅ 선택한 방법
좋아요, 북마크와 관련된 값이 변경될 때 코스,장소 상세페이지의 메인 컨텐츠들에는
영향을 주지 않기 때문에 컴포넌트 안에서 API요청을 하고 state를 변경하기로 했다.
page단으로 올려버리면 중복 코드는 물론 좋아요/북마크 버튼을 누를 경우 관련된 하위 컴포넌트들까지
전부 리렌더링 되기 때문에 차라리 컴포넌트 내부에서 사용하는게 나을 것 같다고 생각했다.
const DetailSidebar = ({
likes = 0,
id,
defaultLiked,
defaultBookmarked,
isLoggedIn,
type
}: DetailSidebarProps) => {
const [isLiked, setIsLiked] = useState(defaultLiked);
const [isBookmarked, setIsBookmarked] = useState(defaultBookmarked);
const [totalLikes, setTotalLikes] = useState(likes);
const router = useRouter();
const handleClickLike = async () => {
if (!isLoggedIn) {
router.push('/login');
return;
}
const result = await LikeApi.like(id, type);
setIsLiked(result.isLiked);
setTotalLikes((oldLikes) => (result.isLiked ? oldLikes + 1 : oldLikes - 1));
};
const handleClickBookmark = async () => {
if (!isLoggedIn) {
router.push('/login');
return;
}
const result = await BookmarkApi.bookmark(id, type);
setIsBookmarked(result.isBookmarked);
};
useEffect(() => {
setIsLiked(defaultLiked);
setIsBookmarked(defaultBookmarked);
// 로그인 유저의 데이터로 변경되었을 때를 위해 default값 감지
}, [defaultLiked, defaultBookmarked]);
//.. 생략
API 요청을 할 때 type값을 함께 보내줌으로써 place와 course의 데이터 요청을 나눌 수 있도록 하였다.
중복코드는 줄이게 되었지만 props로 관리해야 할 값이 늘었고 데이터 요청을 구분할 수 있는 API함수 또한
추가로 작성해야 했지만 감안하고 가기로 했다.
이후에 어떤 변수로 어떤 결과를 초래할 지는 아직 잘 모르겠지만 좀 더 나은 방법이 있다면 수정해 볼 예정이다.
'프로젝트' 카테고리의 다른 글
데브코스 최종 프로젝트 - 20~21일차 / 무한스크롤, 카카오 공유, SSR (0) | 2022.08.13 |
---|---|
데브코스 최종 프로젝트 - 19일차 (0) | 2022.08.11 |
데브코스 최종 프로젝트 - 15~16일차 / API연결 + 배포 (0) | 2022.08.08 |
데브코스 최종 프로젝트 - 14일차 / Recoil 연결 및 자동 로그인 (0) | 2022.08.06 |
데브코스 최종 프로젝트 - 10~11일차 (0) | 2022.08.02 |
Comments