2022. 1. 13. 17:32ㆍNext.js
여러 웹사이트들을 가보면 위에 메뉴들이 여기저기 페이지를 옮겨 다녀도 그대로 계속 있는 것을 보실 수 있습니다.
그 메뉴들을 Header 즉, 공유된 컴포넌트라고 합니다.
Next.js에서는 이 Header를 매우 쉽고 간단하게 만들 수 있습니다.
index.js를 아래 사진과 같이 바꿔주세요.
export default function Home() {
return (
<div>
<h1>Home 페이지입니다.</h1>
</div>
);
}
그리고 pages폴더 안에 about.js 파일을 추가해주세요.
about.js도 다음과 같이 바꿔주세요.
export default function about() {
return (
<div>
<h1>About 페이지입니다.</h1>
</div>
);
}
이제 새로운 폴더 하나를 만들 겁니다.
components라는 폴더를 하나 만들어주세요.
components폴더 안에 Header.js라는 파일을 생성해주세요.
그리고 다음과 같이 코드를 짜도록 하겠습니다.
import Link from "next/link";
export default function Header() {
return (
<div>
<Link href="/">
<a>Home</a>
</Link>
<Link href="/about">
<a>About</a>
</Link>
</div>
);
}
이렇게 작성된 Header.js파일을 저희는 pages폴더 안에 있는 _app.js파일에서 import 시켜서 사용할 것입니다.
_app.js파일을 다음과 같이 작성해주세요.
import "../styles/globals.css";
import Header from "../components/Header";
function MyApp({ Component, pageProps }) {
return (
<>
<Header></Header>
<Component {...pageProps}></Component>
</>
);
}
export default MyApp;
여기서 이 _app.js는 5가지의 역할을 합니다.
- 페이지의 변경 간 레이아웃 유지
- 페이지를 탐색할 때 상태 유지
- ComponentDidCatch를 사용한 사용자 지정 오류 처리
- 페이지에 추가 데이터 삽입
- Global CSS 추가
_app.js의 첫 번째 역할, 페이지의 변경 간 레이아웃 유지의 역할 때문에 저희는 이 _app.js 파일에서 공통 컴포넌트를 작성할 수 있게 되었습니다.
이렇게 코드를 짜면 결과는 이렇습니다.
위쪽에 Home About이라고 생겼습니다.
이제 About이라고 새겨진 문구를 한 번 클릭해보겠습니다.
그러면 이렇게 About.js에 썼던 "About 페이지입니다."가 보여지는 것을 알 수 있습니다.
그리고 위에 Home About은 여전히 있구요.
이게 간단한 Header를 작성하는 방법입니다.
근데 이제 문제라고 하면 너무 안 예쁘다는점..
이 Header를 css를 이용해서 다음과 같이 작성하도록 하겠습니다.
Header.js
return (
<nav className="container">
<h2>이기현의 포트폴리오</h2>
<ul className="nav_menu">
<li>
<h4
className="hLink"
style={{ fontWeight: "normal" }}
>
나의 작업물들
</h4>
</li>
<li>
<h4
className="hLink"
style={{ fontWeight: "normal" }}
>
나에 대해서
</h4>
</li>
<li>
<h4
className="hLink"
style={{ fontWeight: "normal" }}
>
나의 기술
</h4>
</li>
</ul>
</nav>
);
global.css (styles 폴더 안에 있습니다.)
@import url("https://fonts.googleapis.com/css2?family=Jua&display=swap");
html,
body {
padding: 0;
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
}
a {
color: inherit;
text-decoration: none;
}
* {
margin: 0;
padding: 0;
color: #000;
box-sizing: border-box;
font-family: "Jua", sans-serif;
}
.container {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
position: -webkit-sticky;
position: sticky;
top: 0;
background-color: white;
padding: 8px 12px;
}
.container > h2 {
margin-left: 20px;
}
.nav_menu {
display: flex;
padding-left: 0;
}
.nav_menu > li {
font-size: 20px;
height: 100%;
display: flex;
align-items: center;
padding: 8px 12px;
}
.nav_menu > li:hover {
color: blue;
border-radius: 10px;
}
.hLink {
cursor: pointer;
}
.hLink:hover {
color: blue;
}
Link를 사용하지 않는 이유는 클릭시 이벤트로 원하는 곳에 스크롤 될 수 있게 사이트를 짤 것이기 때문에 사용하지 않았습니다.
결과는
요렇게 나옵니다.
이제 다음에는 나의 작업물들을 알려주는 것을 만들도록 하겠습니다. 감사합니다.
'Next.js' 카테고리의 다른 글
Next.js를 이용해 포트폴리오 사이트 만들기 - 나의 작업물들 소개하기(2) (0) | 2022.01.15 |
---|---|
Next.js를 이용해 포트폴리오 사이트 만들기 - 기본 세팅하기(1) (0) | 2022.01.12 |