<a>
태그를 사용하여, 페이지를 연결한다./app/ui/dashboard
경로의 <NavLinks/>
컴포넌트를 살펴보면 아래와 같다.import {
UserGroupIcon,
HomeIcon,
DocumentDuplicateIcon,
} from '@heroicons/react/24/outline';
// Map of links to display in the side navigation.
// Depending on the size of the application, this would be stored in a database.
const links = [
{ name: 'Home', href: '/dashboard', icon: HomeIcon },
{
name: 'Invoices',
href: '/dashboard/invoices',
icon: DocumentDuplicateIcon,
},
{ name: 'Customers', href: '/dashboard/customers', icon: UserGroupIcon },
];
export default function NavLinks() {
return (
<>
{links.map((link) => {
const LinkIcon = link.icon;
return (
<a
key={link.name}
href={link.href}
className="flex h-[48px] grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3"
>
<LinkIcon className="w-6" />
<p className="hidden md:block">{link.name}</p>
</a>
);
})}
</>
);
}
<a>
태그는 클릭 이벤트가 발생하면, 페이지의 전체 새로고침이 일어남을 확인할 수 있을 것이다.
<Link>
컴포넌트<Link>
컴포넌트를 사용해, 애플리케이션 내의 페이지 간의 링크를 만들 수 있다. <Link>
컴포넌트를 사용하면, JavaScript를 사용해 클라이언트 측의 탐색을 수행할 수 있다.next/link
에서 제공하는 <Link>
컴포넌트를 import 하여 사용할 수 있다. 아래 예제처럼 /app/ui/dashboard/nav-links.tsx
파일에서 이를 실습해보자. <Link>
컴포넌트에서 사용한 prefetch
는 Beomy님의 포스트를 확인해보면 도움이 될 것이다. import {
UserGroupIcon,
HomeIcon,
DocumentDuplicateIcon,
} from '@heroicons/react/24/outline';
// 추가
import Link from 'next/link';
const links = [
{ name: 'Home', href: '/dashboard', icon: HomeIcon },
{
name: 'Invoices',
href: '/dashboard/invoices',
icon: DocumentDuplicateIcon,
},
{ name: 'Customers', href: '/dashboard/customers', icon: UserGroupIcon },
];
export default function NavLinks() {
return (
<>
{links.map((link) => {
const LinkIcon = link.icon;
// <a> 태그를 <Link> 컴포넌트로 변경
return (
<Link
key={link.name}
href={link.href}
prefetch={false}
className="flex h-[48px] grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3"
>
<LinkIcon className="w-6" />
<p className="hidden md:block">{link.name}</p>
</Link>
);
})}
</>
);
}
<a>
태그와 달리, <Link>
컴포넌트를 사용하면, 전체 새로고침 없이 페이지 사이를 이동할 수 있음을 알 수 있을 것이다.<Link>
컴포넌트의 구성요소가 나타날 때마다, 연결된 route의 코드를 자동으로 백그라운드에서 Prefetch한다.
hook
을 지원하고 있다. 이것이 usePathname()
이다.usePathname()
은 react-hook이기 때문에, nav-links.tsx
에서 사용하려면 해당 컴포넌트를 클라이언트 컴포넌트로 변환해야 한다.
// 추가
"use client";
import {
UserGroupIcon,
HomeIcon,
DocumentDuplicateIcon,
} from "@heroicons/react/24/outline";
import clsx from "clsx";
import Link from "next/link";
// 추가
import { usePathname } from "next/navigation";
usePathname()
을 아래처럼 사용해보자./dashboard
위치에서 usePathname()
을 호출했다면, 콘솔에는 '/dashboard'가 출력될 것이다.export default function NavLinks() {
const pathname = usePathname();
console.log("pathname is ", pathname);
// ...
}
links
객체 안에 있는 href
의 경로와 usePathname()
으로 전달받은 현재 페이지의 경로가 일치하면 clsx 라이브러리를 활용해, active css를 적용하는 코드이다."use client";
import {
UserGroupIcon,
HomeIcon,
DocumentDuplicateIcon,
} from "@heroicons/react/24/outline";
import clsx from "clsx";
import Link from "next/link";
import { usePathname } from "next/navigation";
// Map of links to display in the side navigation.
// Depending on the size of the application, this would be stored in a database.
const links = [
{ name: "Home", href: "/dashboard", icon: HomeIcon },
{
name: "Invoices",
href: "/dashboard/invoices",
icon: DocumentDuplicateIcon,
},
{ name: "Customers", href: "/dashboard/customers", icon: UserGroupIcon },
];
export default function NavLinks() {
const pathname = usePathname();
console.log("pathname is ", pathname);
return (
<>
{links.map((link) => {
const LinkIcon = link.icon;
return (
<Link
key={link.name}
href={link.href}
// 여기
className={clsx(
"flex h-[48px] grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3",
{
"bg-sky-100 text-blue-600": pathname === link.href,
}
)}
>
<LinkIcon className="w-6" />
<p className="hidden md:block">{link.name}</p>
</Link>
);
})}
</>
);
}