Replies: 3 comments
0 replies
|
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);이렇게 변수로 나누는 느낌..? |
0 replies
|
안녕하세요 뉴진스의 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 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
!!긴급!!
안녕하세요 돌아온 똥믈리에 박규태입니다.
오늘 여러분에 보여줄 똥같은 코드는 예전 프로젝트에서 사용한 pagination입니다.
TAJO에서도 공통컴포넌트로 pagination을 구현하고 있는데 여러분들은 어떻게 구현하셨는지 조언을 구하고 싶습니다.
코드를 보시면 아시겠지만 벌써부터 냄새가 진동합니다...
제 알고리즘 실력을 뽑내고 싶었던지 배열을 미리 정해버리고 코드를 작성해 버렸네요,,, (큰 배열 렌더링 문제,,,)
여기서 잠깐!
여러분들에게 조언을 구하고 싶은 부분을 적어보겠습니다..
여러분들의 많은 조언들이 TAJO에 큰 발전이 됩니다,,,,
그럼 이만,,,
All reactions