Replies: 3 comments
-
Beta Was this translation helpful? Give feedback.
-
|
Pagination 저도 인턴 생활하면서 같은 싸움을 한 적이 있습니다 ㅋㅋㅋㅋㅋ /**
*
* @param totalPage 총 Pagination Length
* @param currentPage 현재 Page
* @param onChangePage 해당 페이지로 이동할 때 기능 동작
* @param nearbyPages (optional) 페이지가 보이는 갯수
*/
export default function Pagination(props: Props) {
const { currentPage, totalPage, onChangePage, nearbyPages = 9 } = props;
const [page, setPage] = useState(currentPage);
/* Page값이 없을 때 null값 return */
if (totalPage === 0) return <></>;
/* 페이지 보여지는 숫자 부분 계산 */
const halfNearbyPages = Math.floor(nearbyPages / 2);
let start = Math.max(1, currentPage - halfNearbyPages);
const end = Math.min(totalPage, start + nearbyPages - 1);
if (end === totalPage) {
start = Math.max(1, totalPage - nearbyPages + 1);
}
/* 페이지 보여지는 부분 배열화 */
const pages = Array.from({ length: end - start + 1 }, (_, index) => start + index);
// (...클릭 이벤트 생략...)
return (
<div className={styles.Pagination}>
<button type="button" disabled={page === 1} className={styles.Pagination_btn} onClick={onClickMorePrev}>
<IconArrowMorePrev />
</button>
<button type="button" disabled={page === 1} className={styles.Pagination_btn} onClick={onClickPrev}>
<IconArrowPrev />
</button>
{pages.map((pageNumber) => (
<button
key={pageNumber}
className={pageNumber === page ? styles.Pagination_btn_selected : styles.Pagination_btn}
type="button"
onClick={(e) => handleChange(e, pageNumber)}
>
{pageNumber}
</button>
))}
<button type="button" disabled={page === totalPage} className={styles.Pagination_btn} onClick={onClickNext}>
<IconArrowNext />
</button>
<button type="button" disabled={page === totalPage} className={styles.Pagination_btn} onClick={onClickMoreNext}>
<IconArrowMoreNext />
</button>
</div>
);
}useState를 안에다 두어서 state를 내부에다가 관리하고, 각각의 버튼마다 최대한 알아보기 쉽도록 분리하면서 짰던 기억이 떠오릅니다 밑에 컴포넌트는 어느 정도 가독성이 있어서 괜춘해 보이고 여기서 굳이 분류하자면 const startStage = pageIndex * stagesPerPage + 1;
const endStage = Math.min((pageIndex + 1) * stagesPerPage, totalStages);이렇게 변수로 나누는 느낌..? |
Beta Was this translation helpful? Give feedback.
-
|
안녕하세요 뉴진스의 6번째 멤버 규태님~ 1. usePagination hook저는 페이지네이션 할 때 usePagination 이라는 훅을 만들어서 사용했었습니다. 하도 예전이라 코드는 없지만
2. react-query 랑 같이 쓰기
import { useQuery } from '@tanstack/react-query';
import { useQueryFunc } from '@/hooks/common/useQueryFunc';
import { getTemplates } from '@/services/common/template-services';
import { TemplateSearchQueryType } from '@/types/notification/[notification-type]/template/TemplateSearchQueryType';
import { TemplateListType } from '@/types/notification/[notification-type]/template/TemplateType';
export const useTemplates = (
notificationType: string,
templateSearchQuery: TemplateSearchQueryType,
size?: number,
page?: number,
) => {
const { data, isLoading, error, refetch } = useQuery({
queryKey: [templateSearchQuery, size, page],
queryFn: () =>
// eslint-disable-next-line react-hooks/rules-of-hooks
useQueryFunc<TemplateListType>(
getTemplates(
notificationType,
{ page: page ? page : 1, size: size ? size : 10 },
templateSearchQuery,
),
),
refetchOnWindowFocus: false,
notifyOnChangeProps: ['data'],
});
return {
templatesList: data,
templatesListIsLoading: isLoading,
templatesListError: error,
refetchTemplatesList: refetch,
};
};
해적왕님 오늘도 고생하셨습니당 b |
Beta Was this translation helpful? Give feedback.

Uh oh!
There was an error while loading. Please reload this page.
-
!!긴급!!
안녕하세요 돌아온 똥믈리에 박규태입니다.
오늘 여러분에 보여줄 똥같은 코드는 예전 프로젝트에서 사용한 pagination입니다.
TAJO에서도 공통컴포넌트로 pagination을 구현하고 있는데 여러분들은 어떻게 구현하셨는지 조언을 구하고 싶습니다.
코드를 보시면 아시겠지만 벌써부터 냄새가 진동합니다...
제 알고리즘 실력을 뽑내고 싶었던지 배열을 미리 정해버리고 코드를 작성해 버렸네요,,, (큰 배열 렌더링 문제,,,)
여기서 잠깐!
여러분들에게 조언을 구하고 싶은 부분을 적어보겠습니다..
여러분들의 많은 조언들이 TAJO에 큰 발전이 됩니다,,,,
그럼 이만,,,
Beta Was this translation helpful? Give feedback.
All reactions