글쓰는 개발자
[next.js] AppRouter와 NavigationBar 본문
반응형
next.js 는 폴더 구조를 따라 라우터를 구성할 수 있는 app router라는 기능을 제공합니다.
app 폴더 내에 dashboard 라는 폴더내에 page.js 혹은 page.tsx 파일을 위치시키면 /dashboard라는 주소로 해당 페이지에 접근할 수 있습니다.
App Router 기능을 잘 활용하여 네비게이션 바를 구성합니다.
위 네비게이션 바 메뉴의 구성에 맞춰 폴더와 페이지, 스타일 파일을 구성합니다. community, course, faq, review 폴더를 생성하고 page.tsx와 style.module.css 를 각각 만들었습니다.
components 폴더에 네비게이션 바를 위한 index.tsx를 만들고 네비게이션은 모든 페이지에 나타날 수 있도록 layout.tsx에 포함해 줍니다.
layout.tsx
import Navigation from "@/components/navigation";
...
export default function RootLayout({children,}: Readonly<{children: React.ReactNode;}>) {
return (
<html lang="en">
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
<Navigation/>
<div className={styles.body}>
{children}
</div>
</body>
</html>
);
네비게이션바는 앞단의 로고와 중단에 메뉴아이템 우측 버튼들로 구성합니다.
export default function Navigation(): ReactElement {
return (
<nav className={styles.nav}>
<div className={styles.menuBar}>
<Logo />
<MenuItems />
<ButtonRow />
</div>
</nav>
);
}
로고는 클릭시 메인화면(/) 으로 돌아가도록 설정하고 이미지를 앞에 오도록 구성합니다.
const Logo = (): ReactElement => {
return (
<Link
href={'/'}
className={styles.logo}>
<Image
className={styles.logoImg}
src="/logo.png" alt="coding club logo"
width={30} height={30} />
<div className={styles.siteName}>Coding Club</div>
</Link>
)
}
메뉴는 추후 변경이 가능하도록 리스트로 만들어 폴더구조에 맞춰 href를 구성합니다.
type menuItemType = {
name: string;
url: string;
}
const menuItem: menuItemType[] = [
{ name: '코스', url: '/course' },
{ name: '커뮤니티', url: '/community' },
{ name: 'FAQ', url: '/faq' },
{ name: '리뷰', url: '/review' },
]
const MenuItems = (): ReactElement => {
return (
<div className={styles.menuItems}>
{menuItem.map(({ name, url }, index) =>
(<Link
key={index}
href={url}
className={styles.menuItem}>{name}</Link>))}
</div>
)
}
마지막으로 버튼을 하나의 블록으로 묶어서 구성합니다.
const ButtonRow = (): ReactElement => {
return (
<div className={styles.buttonRow}>
<div className={styles.loginButton}>Login</div>
<div className={styles.joinButton}>Join</div>
</div>
)
}
menu는 space-between으로 각자 블록이 같은 간격을 띄게 하고 최소 최대를 정해 메뉴의 형태가 무너지지 않게 잡습니다. 또한 flex를 0.9로 잡아 양옆에 적당한 여백을 띄우는 것이 좋습니다.
.menuBar {
display: flex;
flex-direction: row;
justify-content: space-between;
max-width: 1920px;
min-width: 1120px;
flex: 0.9 0 0px;
}
반응형
'Development > Web' 카테고리의 다른 글
[next.js] vercel에 배포하기 (2) | 2025.07.23 |
---|---|
[vue] 설치 및 신규 프로젝트 생성 (4) | 2025.07.23 |
[next.js] style.module.css 사용 (6) | 2025.07.20 |
[next.js] 프로젝트 생성하기 (0) | 2025.07.20 |
[React 기초] useState array update (2) | 2024.08.25 |