728x90
Next.js의 router.push가 클라이언트 사이드 내비게이션을 수행하기 때문입니다.
클라이언트 사이드 내비게이션은 동일한 페이지 컴포넌트가 유지된 상태에서 URL만 업데이트하므로 해당 컴포넌트의 useEffect가 다시 실행되지 않습니다.
해결 방법
1. 강제 새로고침 사용
window.location.href를 사용하여 강제로 새로고침할 수 있습니다. 이 경우 useEffect는 실행됩니다.
const handleGoToBack = () => {
window.location.href = '/chat';
};
2. 라우팅 시 상태 관리
router.push와 함께 특정 상태를 관리하거나 key를 변경하여 useEffect를 강제로 실행하도록 할 수 있습니다.
const handleGoToBack = () => {
router.push('/chat');
router.replace('/chat'); // `replace`를 사용해 URL을 다시 갱신
};
3. 라우터 이벤트 감지
Next.js의 useRouter에는 라우터 이벤트를 감지할 수 있는 방법이 있습니다. 이를 활용해 경로 변경 시 동작을 트리거할 수 있습니다.
import { useRouter } from 'next/router';
useEffect(() => {
const handleRouteChange = (url) => {
if (url === '/chat') {
console.log(`
/chat
`);
}
};
router.events.on('routeChangeComplete', handleRouteChange);
return () => {
router.events.off('routeChangeComplete', handleRouteChange);
};
}, [router.events]);
4. 키 값으로 리렌더링 트리거
컴포넌트의 key를 변경해 강제로 재렌더링되도록 할 수도 있습니다.
const [key, setKey] = useState(0);
const handleGoToBack = () => {
router.push('/chat');
setKey((prev) => prev + 1); // 키 변경으로 컴포넌트 강제 리렌더링
};
// 적용
<ChatContent key={key} />;
728x90
'웹개발' 카테고리의 다른 글
[Next.js] aws ec2 배포하기(1) (feat. Socket.io, pm2, nginx) (0) | 2025.01.30 |
---|---|
[Next.js] 눈물의 vercel 배포 ( ReferenceError: document is not defined) feat. lottie 애니메이션 (0) | 2025.01.21 |
[ Intl.DateTimeFormat ] 날짜와 시간을 로케일(지역) 및 특정 형식에 따라 포맷하기 (0) | 2025.01.07 |
[Next.js] socket.io 를 사용하여 실시간 양방향 통신하기 (0) | 2025.01.02 |
[mongoDB] $ ( 연산자(operator) 또는 플레이스홀더) (0) | 2025.01.02 |