Hari 2 – Navigasi, Layout, & Dynamic Routing
Setelah berhasil melakukan instalasi dan membuat halaman pertama di Hari 1, pada Hari 2 ini kita akan membuat website menjadi lebih hidup. Kita akan belajar cara membuat menu navigasi agar bisa pindah-pindah halaman, membuat tampilan menu yang konsisten (Layout), dan membuat halaman artikel yang pintar (Dynamic Routing).
Tutorial ini tetap menggunakan Windows + VS Code dan melanjutan project nextjs-basic dari hari sebelumnya.
1. Navigasi Antar Halaman (<Link>)
Di HTML biasa, kita menggunakan tag <a> untuk berpindah halaman. Namun, di Next.js kita menggunakan komponen khusus bernama <Link>.
Kenapa harus pakai <Link>?
Jika pakai <a>, layar akan berkedip (loading ulang) setiap pindah halaman. Dengan <Link>, perpindahan halaman terjadi instan tanpa refresh.
1.1 Edit Halaman Home
Kita akan menambahkan tombol untuk pergi ke halaman About.
Buka file src/app/page.tsx, lalu ganti isinya dengan kode ini:
import Link from 'next/link'; // 1. Wajib import ini
export default function Home() {
return (
<div className="p-10">
<h1 className="text-2xl font-bold">Hello Next.js</h1>
<p className="mb-5">Ini adalah hari kedua belajar Next.js</p>
{/* 2. Gunakan Link pengganti tag <a> */}
<Link href="/about" className="text-blue-500 underline">
Pindah ke Halaman About →
</Link>
</div>
);
}
1.2 Edit Halaman About
Sekarang kita tambahkan tombol untuk kembali ke Home.
Buka file src/app/about/page.tsx, ganti isinya:
import Link from 'next/link';
export default function About() {
return (
<div className="p-10">
<h1 className="text-2xl font-bold">Halaman About</h1>
<p className="mb-5">Ini adalah halaman tentang saya.</p>
<Link href="/" className="text-blue-500 underline">
← Kembali ke Home
</Link>
</div>
);
}
Coba sekarang: Jalankan npm run dev, buka browser, dan coba klik link tersebut. Perpindahannya sangat cepat, bukan?
2. Layouts (Membuat Navbar Otomatis)
Capek kan kalau harus membuat tombol menu di setiap halaman? Di Next.js, kita punya file spesial bernama layout.tsx. Apapun yang kita tulis di sini akan muncul di semua halaman.
Kita akan membuat Navbar (Menu Atas) sederhana.
2.1 Edit Global Layout
Buka file src/app/layout.tsx.
Hapus semua isinya, dan ganti dengan kode berikut agar lebih rapi:
import Link from "next/link";
import "./globals.css";
export const metadata = {
title: "Belajar Next.js",
description: "Tutorial Next.js Dasar",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body className="bg-white text-black">
{/* BAGIAN 1: NAVBAR (Akan muncul di semua halaman) */}
<nav className="p-5 bg-gray-800 text-white flex gap-5">
<Link href="/" className="font-bold hover:text-gray-300">Home</Link>
<Link href="/about" className="font-bold hover:text-gray-300">About</Link>
<Link href="/blog" className="font-bold hover:text-gray-300">Blog</Link>
</nav>
{/* BAGIAN 2: KONTEN (Berubah sesuai halaman yang dibuka) */}
<main>
{children}
</main>
</body>
</html>
);
}
Sekarang, coba buka halaman Home atau About. Menu hitam di atas akan selalu ada!
3. Persiapan Halaman Blog
Di menu tadi kita menambahkan link ke Blog, tapi halamannya belum ada. Mari kita buat daftar artikelnya dulu.
3.1 Buat Folder dan File Blog
Buat folder baru di dalam
src/app/dengan namablog.Di dalam folder
blog, buat file baru bernamapage.tsx.
Isi file src/app/blog/page.tsx dengan kode ini:
import Link from "next/link";
export default function BlogPage() {
return (
<div className="p-10">
<h1 className="text-2xl font-bold mb-5">Daftar Artikel</h1>
{/* Daftar Link Manual */}
<ul className="list-disc pl-5 space-y-3">
<li>
<Link href="/blog/belajar-nextjs" className="text-blue-600 hover:underline">
Artikel 1: Cara Belajar Next.js
</Link>
</li>
<li>
<Link href="/blog/tutorial-react" className="text-blue-600 hover:underline">
Artikel 2: Tutorial React Dasar
</Link>
</li>
<li>
<Link href="/blog/tips-coding" className="text-blue-600 hover:underline">
Artikel 3: Tips Coding Pemula
</Link>
</li>
</ul>
</div>
);
}
4. Dynamic Routing (Satu Halaman untuk Semua Artikel)
Jika kamu punya 100 artikel, tidak mungkin kamu membuat 100 file satu per satu. Solusinya adalah Dynamic Routing.
Kita akan membuat "Halaman Cetakan". Apapun judul artikel yang diklik, akan ditangani oleh satu file ini.
4.1 Buat Folder Dynamic
Di dalam folder
src/app/blog/, buat folder baru.Beri nama foldernya:
[slug](Pastikan pakai kurung siku.slugartinya penanda judul di URL).
4.2 Buat File Halaman Dynamic
Di dalam folder [slug] tadi, buat file page.tsx.
Strukturnya jadi: src/app/blog/[slug]/page.tsx.
Isi dengan kode berikut:
// Ini adalah halaman "cetakan"
// params akan menangkap judul yang ada di URL
export default async function DetailArtikel({ params }: { params: { slug: string } }) {
// Kita ambil slug (judul) dari URL
const { slug } = await params;
return (
<div className="p-10">
<h1 className="text-3xl font-bold text-blue-800">Judul Post: {slug}</h1>
<p className="mt-5 text-gray-600">
Halaman ini dibuat otomatis oleh Next.js! <br/>
Kamu sedang membaca artikel dengan ID: <strong>{slug}</strong>
</p>
<div className="mt-10">
<a href="/blog" className="text-sm text-gray-500">← Kembali ke Daftar Blog</a>
</div>
</div>
);
}
4.3 Uji Coba (Magic Time!)
Buka browser, klik menu Blog.
Klik "Artikel 1: Cara Belajar Next.js".
Lihat URL-nya:
/blog/belajar-nextjsLihat Judul di halaman: Judul Post: belajar-nextjs
Coba ganti URL di browser sembarangan, misal:
/blog/halaman-ngawur.Halaman tetap jalan dan judulnya mengikuti: Judul Post: halaman-ngawur.
Inilah kekuatan Dynamic Routing. Satu file untuk menangani ribuan kemungkinan URL.
5. Apa yang Dipelajari di Hari Kedua
Selamat! Hari ini kamu sudah menguasai 3 pilar penting:
Link Component: Navigasi cepat tanpa refresh.
Layout (Navbar): Membuat menu yang konsisten di semua halaman.
Dynamic Routing (
[slug]): Membuat halaman fleksibel yang isinya berubah sesuai URL.
6. Latihan Mandiri
Agar semakin paham, coba tantangan kecil ini:
Tambahkan menu "Contact" di Navbar (
layout.tsx).Buat halaman
src/app/contact/page.tsxyang isinya biodata singkat kamu.Pastikan tombol Contact di menu bisa diklik dan mengarah ke halaman yang benar.
Comments
Post a Comment