[Next.js 블로그] 페이지와 레이아웃
Next.js에서 터미널로직(Terminology) 폴더에 page.js와 layout.js를 사용해서 UI를 만든다.
코딩Next.js 14의 라우팅은 터미널로직을 사용한다.
Next.js 라우팅
Next.js 동적라우팅
폴더로 경로를 지정하기 때문에
페이지 파일은 폴더에 만든다.
기본값으로 폴더의 page.js
파일을 페이지 UI로 사용한다.
app
└ layout.js
└ page.js
Layout.js
NEXT.js 14에서는layout.js
를 사용해서 UI의 기본틀로 사용할 수 있다.
이름처럼 레이아웃을 만들어서 반복되는 작업을 줄일 수 있다.
레이아웃은 모든 하위 경로에 적용된다.
// .\app\layout.js
import { Inter } from "next/font/google";
import "../globals.css";
export default function RootLayout({ children }) {
return (
<html lang="en">
<head>
<link rel="icon" href="/logo.png" sizes="any" />
</head>
<body className={inter.className}>{children}</body>
</html>
);
}
app
폴더의 layout.js
이다.
children을 받아서 주요 콘텐츠는 children을 보여준다.
app
폴더는 최상위 경로이기 때문에
여기의 layout은 모든 경로에 적용된다.
그래서 나는 아래 내용을 수정했다.
- html 태그의 language : lang="ko"
- favicon 수정 : public 폴더에 이미지 추가
- body 태그의 children을 main 태그 사용
- body 태그에 header와 footer 태그 추가
아래 참고
// .\app\layout.js
import { Inter } from "next/font/google";
import "../globals.css";
export default function RootLayout({ children }) {
return (
<html lang="ko">
<head>
<link rel="icon" href="/logo.png" sizes="any" />
</head>
<body className={inter.className}>
<header>해더입니다</header>
<main>{children}</main>
<footer>푸터입니다</footer>
</body>
</html>
);
}
UI계획에
해더 navigation을 만들 것이고,
푸터도 고정이어서 header와 footer를 추가했다.
Page.js
이제 각 페이지를 만들면 된다.
페이지는 레이아웃 구조와 크게 다른 점은 없다.
export default function Home() {
return <h1>여기가 홈페이지입니다</h1>;
}
차이점이라고 하면 children의 유무 정도이다.
페이지 콘텐츠는 layout의 children에 들어간다.
위에 언급한 것처럼 layout은 하위 페이지에 영향을 준다.
app
└ layout.js
└ page.js
└ blog
└ layout.js
└ page.js
└ [slug]
└ page.js
위의 예시는app
안에 layout.js와 blog
폴더가 있다.blog
안에는 또 layout.js이 있고 동적 라우팅 [slug]
폴더가 있다.
이 경우,app
의 layout은 blog
와 [slug]
모두에게 적용된다.blog
의 layout은 같은 폴더의 page.js와 [slug]
에 적용된다.
코드 작성법
export default function Home() {
return <h1>여기가 홈페이지입니다</h1>;
}
page.js와 layout.js의 작성법은 html과 매우 유사하다.
함수 안에 return 값 안에 html 태그를 작성하면 된다.
주의할 점은 여러줄의 경우
- 반드시 한개의 태그로 감싸야 한다.
- return 값을 괄호로 감싸야 한다.
export default function Home() {
return (
<div>
<h1>여기가 홈페이지입니다</h1>
<p>홈페이지에 오신 것을 환영합니다</p>
</div>
);
}
html과 다른점은
javascript문이고, 자체로 함수이다.
그래서 변수도 사용이 가능하다.
(잘 보면 레이아웃에서도 변수를 사용했었다)
export default function Home() {
const title = "독깨비";
return (
<div>
<h1>여기가 {title} 홈페이지입니다</h1>
<p>{title} 홈페이지에 오신 것을 환영합니다</p>
</div>
);
}
<!-- 위에 코드 출력 예시 (layout포함) -->
<body class="__className_a123456">
<header>해더입니다</header>
<main>
<div>
<h1>여기가 독깨비 홈페이지입니다</h1>
<p>독깨비 홈페이지에 오신 것을 환영합니다</p>
</div>
</main>
<footer>푸터입니다</footer>
</body>
pages와 layouts의 nextjs 공식 설명