
주말에 페이지네이션을 어떻게 구성 할 지 머릿속으로 생각은 해봤지만 막상 코드를 짜려니 막막했다.
그러다가 알고리즘 수업에서 적용했던 방식을 적용해보기로 했다.
해결 과정을 천천히 적어보는 것
이런 식으로 하나씩 적어보고 그것을 다시 코드로 구현해봤더니
어느정도 작동을 하는 코드가 만들어지고 있었다.
const totalPost =
boardTitle === '최신글'
? posts.map((post) => <Post key={post.id} post={post} />).length
: filteredPosts.map((post) => <Post key={post.id} post={post} />).length;
const postPerPage = 10;
const pagePerBoard = 5;
const totalPage = Math.ceil(totalPost / postPerPage);
const currentPage = Number(useLocation().search.replace(`?page=`, ''));
예로 들어보면 ?page=1에 해당하는 부분이 쿼리스트링의 형태!

const [searchParams, setSearchParams] = useSearchParams();
...map((num)=><button onClick={()=>setSearchParams({ page: num })} />)
위에서 setSearchParams로 쿼리스트링을 설정 해주고 나서
useLocation()를 콘솔에 찍어보면 아래와 같이 나온다.

그것을 활용하기 위해 가공해보자.
useLocation().search.replace(`?page=`, '') // 1
나는 가공해서 나온 쿼리스트링 데이터를 가지고 currentPage로 설정해서 페이지네이션을 구현했다.
페이지네이션을 구현하는데 가장 큰 역할을 했던 메서드
갖고 있는 데이터를 가지고 처음 시작은 무엇이고 어디까지 인지 보여줄지에 대해서 활용 가능했다.
예시
const [start, setStart] = useState(1);
const showPage = () => {
const page = [];
for (let i = 1; i <= totalPage; i++) {
page.push(i);
}
return page.slice(start - 1, start - 1 + 5).map((num) => (
<StButton key={num} $active={num === currentPage} onClick={() => setSearchParams({ page: num })}>
{num}
</StButton>
));
};
기능을 구현하다 보면 만든 로직들이 다른 로직이나 상태들과 긴밀하게 연관이 있는 경우가 많다.
그때, 의존성 배열을 활용하는 useEffect 훅을 사용해서 연관을 지어줬다.
예시
useEffect(() => {
if (currentPage === start + pagePerBoard) setStart((prev) => prev + pagePerBoard);
if (currentPage < start) setStart((prev) => prev - pagePerBoard);
}, [currentPage, start]);
하고 싶은 것도 해야할 것도 많은데 시간이 부족하다 하루를 36시간 줬으면 더 많은 것을 해볼 수 있을텐데..
시간 활용을 잘 할 수 밖에 없다.