-
Notifications
You must be signed in to change notification settings - Fork 46
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
[이동훈] Sprint9 #312
The head ref may contain hidden characters: "Next-\uC774\uB3D9\uD6C8-sprint9"
[이동훈] Sprint9 #312
Conversation
- Tailwind에선 기본적으로 preflight를 통해 reset.css를 제공하므로 제거 - color palete 같은 경우엔 tailwind.config.js파일에서 추가
- react, next 등 외부 라이브러리 - 절대 경로 import - 상대 경로 import - css/스타일
…-Sprint-Mission into Next-이동훈-sprint9
const fetchBestArticles = useCallback(async () => { | ||
const response = await getArticles({ | ||
pageSize: BEST_ARTICLE_SIZE, | ||
orderBy: 'like', | ||
}); | ||
setBestArticles(response); | ||
}, []); | ||
|
||
const fetchArticles = useCallback(async () => { | ||
const pageSize = isMobile | ||
? ARTICLES_PER_MOBILE_PAGE | ||
: ARTICLES_PER_DESCKTOP_PAGE; | ||
|
||
if (searchQuery === '') { | ||
const response = await getArticles({ | ||
pageSize, | ||
orderBy: sort, | ||
}); | ||
setArticles(response); | ||
return; | ||
} | ||
|
||
const response = await getArticles({ | ||
page, | ||
pageSize, | ||
orderBy: sort, | ||
keyword: searchQuery, | ||
}); | ||
|
||
setArticles(response); | ||
}, [page, sort, searchQuery, isMobile]); | ||
|
||
useEffect(() => { | ||
fetchBestArticles(); | ||
fetchArticles(); | ||
}, [fetchBestArticles, fetchArticles]); |
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.
지난 코드리뷰에서 자주 쓰이는 fetch
함수 부분을 훅으로 만들어 사용할 수 있다고 알려주셨습니다.
이번에 적용해보려고 했는데, 함수 형태는 비슷하지만 의존성을 가지는 parameter
가 여러 개라서 어떻게 적용해야할 지 잠 모르겠습니다!
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.
아래 처럼 어떤 의존성을 주더라도 useFetch 훅에서는 fetch 함수에게 받아온 parameter
값을 그대로 전달하는 방법으로 설계하면 어떨까요?
예를들면 fetch 는 아래처럼 되야할거예요. axios의 params 옵션은 자동으로 query string으로 변환되기 때문에, 파라미터를 그대로 전달하면 됩니다.
interface FetchParams extends Record<string, any> {
page?: number;
pageSize?: number;
orderBy?: 'recent' | 'like';
keyword?: string;
}
const getArticles = async (params: FetchParams) => {
const response = await axios.get('/articles', { params });
return response.data;
};
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.
가칭 useFetch는 아래 아디이어 같은 방법이 있겠어요. 동작할 수 있게 디테일한 내용은 수정해야겠지만요!
interface FetchState<T> {
data: T | null;
error: Error | null;
isLoading: boolean;
}
const useFetch = <T, P extends Record<string, any>>(
fetcher: (params: P) => Promise<T>,
params: P,
deps?: any[]
) => {
const [state, setState] = useState<FetchState<T>>({
data: null,
error: null,
isLoading: false
});
useEffect(() => {
const fetchData = async () => {
setState(prev => ({ ...prev, isLoading: true }));
try {
const data = await fetcher(params);
setState({ data, error: null, isLoading: false });
} catch (err) {
setState({ data: null, error: err as Error, isLoading: false });
}
};
fetchData();
}, deps ? [...deps] : [JSON.stringify(params)]);
return state;
};
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.
그렇담 실제로 사용할 때, 아래처럼 어떤 parameter
값이 전달되어서 무방할 것 같아요~ 😸
// articles
const { data: articles } = useFetch(getArticles, {
page: 1,
pageSize: 10,
orderBy: 'recent'
});
// products
const { data: products } = useFetch(getProducts, {
category: 'electronics',
limit: 20,
sort: 'desc'
});
export const BEST_ARTICLE_SIZE = 3; | ||
export const ARTICLES_PER_MOBILE_PAGE = 7; | ||
export const ARTICLES_PER_DESCKTOP_PAGE = 10; |
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.
상수를 한 파일에 정리하는 습관 좋습니다. 👍
|
||
export default function Document() { | ||
return ( | ||
<Html lang="en"> | ||
<Html lang='en'> |
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.
en 이 아니라 kr로 변경해주셔야 되겠죠!? 🙂
}) { | ||
return ( | ||
<section className=''> | ||
<div className='flex justify-between items-center'> |
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.
정말 자주 사용하는 flex items-center justify-center
이런 것들은 global.css 에 아래처럼 클래스네임을 직접 커스텀하게 추가해서 사용해보세요. 예를들어 flex-center로 작명 후 조금 더 빠르게 스타일을 선언할 수 있습니다.
@layer components {
.flex-center {
@apply flex items-center justify-center
}
}
이 후, 아래처럼 적용해볼 수 있겠어요.
<div className='flex-center'>
import BestArticleContainer from './BestArticleContainer'; | ||
import Header from './Header'; | ||
import ArticleContainer from './ArticleContainer'; | ||
import SearchBar from './SearchBar'; |
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.
이러한 컴포넌트들도 @hooks/ 처럼 절대주소를 사용하는걸로 통일 하면 더 좋습니다. 🙂
const [isOpen, setIsOpen] = useState(false); | ||
|
||
const handleOptionClick = (option: sort) => { | ||
console.log(option); |
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.
콘솔 제거 필요합니다. 😎
height={28} | ||
/> | ||
</div> | ||
<div className='hidden sm:block'> |
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.
보통 반응형 코드를 작성할 때 모바일 > 태블릿 > 데스크탑 기준으로 클래스명을 작성해요. 이 순서로 하게 되면 lg는 굳이 붙이지 않아도 도 되겠죠!?
<div className='sm:block md:0000 hidden'>
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.
수고하셨습니다~ 👍
요구사항
기본
심화
이미지
반응형 디자인 구현
검색 기능
title
에 검색어가 포함되면 가져온다고 되어있는데,content
에 포함되어있어도 가져오도록 백엔드에서 구현된 것 같습니다.필터링 기능
멘토에게
Next.js
로 새롭게 프로젝트를 생성하는 만큼 스타일링도 새 기술을 사용하고 싶어tailwind css
를 사용했습니다.example.com
같은 값이 들어있는 경우엔alt
값이 출력됩니다. 이 경우엔 어떻게 해야 할 지 잘 모르겠습니다.