-
Notifications
You must be signed in to change notification settings - Fork 38
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[임귀태] Sprint10 #301
The head ref may contain hidden characters: "Next-\uC784\uADC0\uD0DC-sprint10-2"
[임귀태] Sprint10 #301
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
리뷰는 머지 이후 진행하겠습니다! 🙏
const handleSortSelection = (sortOption: ArticleSortOption) => { | ||
setOrderBy(sortOption); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
전반적으로 코드 잘 작성하셨는데요, 불필요한 리랜더링 방지하기 위해 아래처럼 useCallback
사용도 고민 해보면 더 좋겠어요.
const handleSortSelection = useCallback((sortOption: ArticleSortOption) => {
setOrderBy(sortOption);
}, []);
useEffect(() => { | ||
const fetchArticles = async () => { | ||
let url = `https://panda-market-api.vercel.app/articles?orderBy=${orderBy}`; | ||
if (keyword.trim()) { | ||
// encodeURIComponent는 공백이나 특수 문자 등 URL에 포함될 수 없는 문자열을 안전하게 전달할 수 있도록 인코딩하는 자바스크립트 함수예요. | ||
url += `&keyword=${encodeURIComponent(keyword)}`; | ||
} | ||
const response = await fetch(url); | ||
const data = await response.json(); | ||
setArticles(data.list); | ||
}; | ||
|
||
fetchArticles(); | ||
}, [orderBy, keyword]); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요거 같은 경우는 useArticles
커스텀 훅을 별도로 빼서 사용하는 방법이 재사용성이 올라가고 공통으로 에러 처리등 일관된 처리를 진행할 수 있어서 아래처럼 빼 보면 좋겠습니다.
const { articles, loading, error } = useArticles(orderBy, keyword);
<ImageWrapper> | ||
<Image | ||
fill | ||
src={article.image} | ||
alt={`${article.id}번 게시글 이미지`} | ||
style={{ objectFit: "contain" }} | ||
/> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Next.js Image 컴포넌트 사용 시 sizes 속성을 추가하여 더 나은 이미지 최적화를 할 수 있습니다.
아래 문서를 참조해주세요~
https://nextjs.org/docs/pages/api-reference/components/image
import { useState, useEffect } from "react"; | ||
|
||
const useViewport = () => { | ||
const [width, setWidth] = useState(0); | ||
|
||
useEffect(() => { | ||
const handleWindowResize = () => setWidth(window.innerWidth); | ||
handleWindowResize(); | ||
window.addEventListener("resize", handleWindowResize); | ||
return () => window.removeEventListener("resize", handleWindowResize); | ||
}, []); | ||
|
||
return width; | ||
}; | ||
|
||
export default useViewport; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
해당 함수 경우 resize 실행 될 때 최적화가 필요합니다. 이럴 땐 연속적인 이벤트가 발생 시 마지막 이벤트만 처리하는 debounce
개념을 통해 해결할 수 있어요.
아래처럼 리팩토링 할 경우, 불필요한 연산을 줄이고 성능을 향상 시킬 수 있습니다. lodash/debounce
라이브러리 크기가 무겁다면, just-debounce
사용해도 무방해요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
import debounce from 'lodash/debounce';
function useViewport() {
const [width, setWidth] = useState(() =>
typeof window !== 'undefined' ? window.innerWidth : 0
);
const handleWindowResize = useCallback(() => {
const newWidth = window.innerWidth;
if (newWidth !== width) {
setWidth(newWidth);
}
}, [width]);
useEffect(() => {
if (typeof window === 'undefined') return;
const debouncedHandleResize = debounce(handleWindowResize, 150);
window.addEventListener('resize', debouncedHandleResize);
return () => {
debouncedHandleResize.cancel(); // Lodash debounce의 cancel 메서드
window.removeEventListener('resize', debouncedHandleResize);
};
}, [handleWindowResize]);
return width;
}
export default useViewport;
요구사항
기본
심화
상품 등록 페이지를 구현합니다.
/addboard
입니다.등록
버튼이 활성화됩니다.등록
버튼을 누르면 게시물 상세 페이지로 이동합니다.상품 상세 페이지를 구현합니다.
/board/{id}
입니다.등록
버튼이 활성화됩니다.등록
버튼을 누르면 댓글이 등록됩니다.멘토에게