usePathname
usePathname 은 현재 URL 경로를 가져와 주는 기능 입니다.
usePathname 을 사용하려면 클라이언트 컴포넌트 이기 때문에 "use client" 를 사용하셔야 합니다.
"use client"
import React from 'react'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import '@/styles/styles.css'
const Navigater = () => {
const path = usePathname();
return (
<div>
<Link href="/" className={path === '/' ? 'link navbar' : 'navbar'}>Home</Link>
<Link href="/about" className={path === '/about' ? 'link navbar' : 'navbar'}>About</Link>
</div>
)
}
export default Navigater
// 똑같습니다. 원하는 형식에 맞춰서 사용하시면 됩니다.
<div className={ path.startsWith('/meals') ? intro : null }
<div className={ path === '/meals' ? intro : null }
next 에서는 import Link from 'next/link' 사용 -> <Link href="/about"> about us </Link>
절대 경로 설정하기
만약 폴더를 계속 올라가서 특정 Component 를 찾아야 한다면 ../../..... 와 같이 무수하게 위로 올라가서 찾아야 합니다.
하지만 Next.js 에서 tsconfig.json 부분에서 절대 경로를 설정해 주면 이러한 불필요한 작업을 하지 않아도 됩니다.
// before
import { Button } from '../../../components/button'
// after
import { Button } from '@/components/button'
tsconfig.json 에 들어가서 밑에 코드처럼 설정해 줍니다.
{
"compilerOptions": {
"baseUrl": "."
}
}
그리고 Button Component 를 설정 해 준 뒤에 원하는 곳에서 꺼내시면 됩니다.
export default function Button() {
return <button>Click me</button>
}
import Button from '@/components/button' <-- 이렇게
export default function HomePage() {
return (
<>
<h1>Hello World</h1>
<Button />
</>
)
}
별칭 설정
기본 경로(baseUrl) 설정 외에도, "paths" 옵션을 사용하여 모듈 경로를 "별칭(alias)"으로 설정할 수 있습니다.
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/components/*": ["components/*"]
}
}
}
import Button from 'components/button'
export default function HomePage() {
return (
<>
<h1>Hello World</h1>
<Button />
</>
)
}
not-found
[id] -> page.js 에서 만약 원하는 id 를 통한 페이지를 찾을 수 없을 때 그 폴더에서 설정한 not-found.js 파일이 자동으로 실행되지 않습니다. 다른 page 에서는 자동으로 not-found.js 를 참고하지만 이렇게 예외 상황이 생길 경우 내가 직접 설정을 해 주어야 합니다.
import { notFound } from 'next/navigation';
const Home = () => {
if(!check) {
notFound()
}
return (
<div>
...
</div>
)
}
useRouter()
import { useRouter } from 'next/navigation'
const About = () => {
const router = useRouter()
// router.?
// ? = back, forward, prefetch, push, refresh, replace
...
}
router.back()
브라우저의 뒤로 가기 버튼을 누른 것과 동일한 동작을 합니다.
router.forward()
브라우저의 앞으로 가기 버튼을 누른 것과 동일한 동작을 합니다.
router.prefetch(url)
지정한 url을 미리 로드하여, 사용자가 해당 페이지로 이동할 때 빠르게 로딩되도록 합니다. 이는 성능 최적화에 유용합니다.
import { useRouter } from 'next/navigation';
import { useEffect } from 'react';
const MyComponent = () => {
const router = useRouter();
useEffect(() => {
router.prefetch('/about');
}, []);
return <div>Content</div>;
};
export default MyComponent;
router.refresh()
현재 페이지를 새로고침합니다. Next.js 13에서는 데이터를 다시 로드하는 데 유용합니다.
router.push(url, as?, options?)
사용자를 지정한 url로 이동시키고, 히스토리 스택에 새로운 항목을 추가합니다.
즉, 브라우저의 뒤로 가기 버튼을 눌렀을 때 이전 페이지로 돌아갈 수 있습니다.
as
as 매개변수는 브라우저의 URL 표시줄에 표시될 경로를 지정하는 데 사용됩니다.
기본적으로 as는 url과 동일하지만, [id] 처럼 동적 페이지를 로딩할 때 필요합니다.
const handleNavigate = () => {
router.push('/posts/[id]', '/posts/123');
};
options
다양한 부분이 들어 갈 수 있지만 대표적으로 scroll 이 있습니다.
scroll: 기본값은 true입니다. 페이지 이동 후 스크롤 위치를 맨 위로 설정합니다.
scroll을 false로 설정하면 페이지 이동 후 현재 스크롤 위치를 유지합니다.
const handleNavigate = () => {
router.push('/about', undefined, { scroll: false });
};
router.replace(url, as?, options?)
push와 비슷하지만, 현재 항목을 히스토리에 추가하지 않고 대신합니다.
이 메서드는 브라우저의 뒤로 가기 버튼을 눌렀을 때 이 페이지를 건너뛰게 합니다.
차이점 요약
push: 새로운 페이지로 이동하고 히스토리 스택에 새로운 항목을 추가합니다. 뒤로 가기 버튼을 눌러 이전 페이지로 돌아갈 수 있습니다.
replace: 새로운 페이지로 이동하고 히스토리 스택의 현재 항목을 대체합니다. 뒤로 가기 버튼을 눌러 이전 페이지로 돌아갈 수 없습니다.
요약
back: 브라우저의 뒤로 가기.
forward: 브라우저의 앞으로 가기.
prefetch: 페이지를 미리 로드하여 성능 최적화.
push: 지정한 URL로 이동.
refresh: 현재 페이지를 새로고침.
replace: 히스토리를 대체하여 지정한 URL로 이동.
'Next' 카테고리의 다른 글
[Next.js] 이미지 최적화 (4) | 2024.09.22 |
---|---|
[Next.js] 배포시 console 지우기 (1) | 2024.09.20 |
Next.js MetaData 심화 (0) | 2024.07.30 |
Next.js (0) | 2024.05.21 |