일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- intersection opserver
- Spacer
- nextjs사용법
- Vue
- 리액트
- 프로그래머스 데브코스 프론트엔드
- 고양이 사진 검색기
- 이벤트 수식어
- 프로그래머스 프론트엔드 데브코스
- SCSS use
- postcss
- netlify redirect
- SCSS extend
- 프로그래머스 데브코스
- vue 지역 컴포넌트
- 리스트 렌더링
- flex
- 폼 입력 바인딩
- git 같은계정 다른 컴퓨터
- SCSS forward
- 프로그래머스 K_Digital Training
- SCSS import
- 쌓임맥락
- vuex map
- vue mixin
- react next
- 다른컴퓨터에서 git사용
- vue 이벤트 수신
- KDT 프로그래머스
- KDT 프로그래머스 데브코스 프론트엔드
- Today
- Total
혼자 적어보는 노트
[Next.js] Shallow: true 뒤로가기 시 데이터 패칭 본문
이전 프로젝트에서 CSR로만 구성되어 있던 유저 페이지를 SSR을 통해 일부 데이터를 미리 받는 방식으로
변경을 하기로 했다.
export const getServerSideProps = async (context: NextPageContext) => {
const { id } = context.query;
const userId = Number(id);
if (Number.isNaN(userId)) {
return {
notFound: true
};
}
try {
const user = await UserApi.getUser(userId);
return {
props: { user, userId }
};
} catch (e) {
return {
notFound: true
};
}
};
이렇게 미리 받으면 페이지를 렌더하기 전에 서버에 일치하는 값이 없을 경우
404로 보내버릴 수 있고 데이터를 미리 받아서 head의 title에도 넣을 수 있었다.
하지만,,
❗ 문제상황
다른 유저의 페이지에서 로그인한 유저의 페이지로 이동하는 것은 정상적으로 이동이 되지만
뒤로가기를 할 경우 route가 바뀜에도 불구하고 다른 유저의 데이터를 보여주지 않는 문제가 발생했다.
왜??!
추측해본 바로는 유저 페이지의 Tab을 유지시키기 위해
유저페이지에 접근했을 때 router.replace를 통해 tab에 대한 active값을 query로 담아주고 있는데
이 부분 때문에 뒤로가기 시 인지를 못하는것 같았다.
const replaceRoute = (query: UserInfoTab) => {
router.replace(
{ pathname: '/userinfo/[id]', query: { tab: query } },
`/userinfo/${userId}?tab=${query}`,
{
shallow: true
}
);
};
shallow 옵션을 빼면 정상적으로 작동이 되지만
현재 _app.tsx에 shallow가 아닌 route이동 시 로딩 스피너를 보여주는 코드를 작성해놓았고
유저 페이지에 접근하자마자 replace를 하고 있기 때문에 shallow 옵션을 빼버린다면
무한 렌더링이 생기기 때문에😢 일단 다른 방법으로 해결을 해보기로 했다.
좀 더 자세히 테스트를 해 보니
shallow로 replace한 마이페이지 url에서 shallow로 replace한 다른 유저 페이지 url로 이동할 경우에
getServerSideProps가 실행되지 않는 것으로 확인되었다.
✅문제 해결
뒤로가기 이벤트가 발생했을 때 serversideProps를 다시 실행시킬 순 없을까 검색 하다가
정말 우연히 발견한 글을 읽다가 해결했다.
router.beforePopState(({ as, options }) => {
if (options.shallow) {
router.replace(as);
return false;
}
return true;
});
뒤로가기/앞으로가기 시 option이 shallow일 경우 popstate를 하지 않고 다시 replace를 해줌으로써
원하는대로 동작하게 되었다.🙌
❗ 여기서 as는 뒤로가기/앞으로가기를 통해 진입하는 페이지의 경로가 담긴다.
같은 페이지를 이동하는데에 있어서 처리해줄 코드들이 조금 있기는 했지만
위 코드가 힌트가 되어 나머지는 금방 처리할 수 있었다
'NextJS' 카테고리의 다른 글
[Next.js] MSW로 API 모킹하기 (0) | 2022.10.13 |
---|---|
[Next.js] SVGR 으로 SVG 파일 다루기 (0) | 2022.10.05 |
[Next.js] 페이지 이동 시 로딩 (0) | 2022.08.19 |
[Next.js] 카카오톡 공유하기 (0) | 2022.08.13 |
[Next.js] router.query 값 가져오기 (0) | 2022.08.04 |