REACT.JS - React Router untuk navigasi multi-halaman

 

Mari kita lanjutkan dengan pembahasan tentang **React Router**. **React Router** adalah pustaka (library) yang populer untuk mengelola **navigasi multi-halaman** di aplikasi React. React Router memungkinkan kita membuat aplikasi berbasis **SPA (Single Page Application)**, di mana halaman tidak benar-benar dimuat ulang saat berpindah halaman, melainkan URL berubah dan komponen yang sesuai dengan rute di-render secara dinamis.

### Konsep Utama dalam React Router

1. **BrowserRouter**: Ini adalah komponen yang membungkus seluruh aplikasi dan memungkinkan penggunaan React Router. BrowserRouter menggunakan **HTML5 history API** untuk menjaga URL tetap sinkron dengan tampilan halaman.
2. **Routes dan Route**: **Route** mendefinisikan jalur (URL) yang memetakan ke komponen tertentu. **Routes** digunakan untuk membungkus semua Route dan mengelola pencocokan URL dengan Route yang sesuai.
3. **Link**: Ini adalah pengganti elemen `<a>` tradisional dalam HTML untuk navigasi di React. **Link** mencegah pemuatan ulang halaman saat berpindah antara rute.
4. **useParams**: Hook yang memungkinkan akses ke parameter dalam URL, sangat berguna untuk rute dinamis.
5. **useNavigate**: Hook untuk melakukan navigasi programatik ke rute lain.

### Cara Menggunakan React Router

Untuk mulai menggunakan React Router, kita harus memasangnya terlebih dahulu:

```bash
npm install react-router-dom
```

Kemudian, kita bisa mulai mengimplementasikan React Router dalam aplikasi kita.

### 1. Membuat Router Dasar

#### Contoh Router Sederhana:

```jsx
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';

function Home() {
  return <h2>Home Page</h2>;
}

function About() {
  return <h2>About Page</h2>;
}

function Contact() {
  return <h2>Contact Page</h2>;
}

function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li><Link to="/">Home</Link></li>
            <li><Link to="/about">About</Link></li>
            <li><Link to="/contact">Contact</Link></li>
          </ul>
        </nav>

        {/* Routes */}
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/contact" element={<Contact />} />
        </Routes>
      </div>
    </Router>
  );
}

export default App;

#### Penjelasan:
- **`<Router>`**: Membungkus aplikasi dan memungkinkan penggunaan routing.
- **`<Link>`**: Navigasi ke rute yang berbeda tanpa refresh halaman.
- **`<Routes>`**: Membungkus semua rute.
- **`<Route path="/path" element={<Component />}`**: Mendefinisikan jalur dan komponen yang harus dirender ketika URL cocok dengan `path`.

### 2. Rute Dinamis (Dynamic Routing)

Rute dinamis memungkinkan kita untuk menangkap variabel dari URL dan menggunakannya dalam komponen. Misalnya, kita bisa menangkap ID dari URL dan menampilkan konten yang sesuai berdasarkan ID tersebut.

#### Contoh Rute Dinamis:

```jsx
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link, useParams } from 'react-router-dom';

function Home() {
  return <h2>Home Page</h2>;
}

function Product() {
  let { id } = useParams();  // Mengambil nilai parameter ID dari URL
  return <h2>Product ID: {id}</h2>;
}

function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li><Link to="/">Home</Link></li>
            <li><Link to="/product/1">Product 1</Link></li>
            <li><Link to="/product/2">Product 2</Link></li>
          </ul>
        </nav>

        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/product/:id" element={<Product />} />  {/* Rute dinamis */}
        </Routes>
      </div>
    </Router>
  );
}

export default App;

#### Penjelasan:
- **`useParams()`**: Hook yang mengakses parameter dari URL (misalnya `:id`). Dalam contoh ini, kita mengambil parameter `id` dari URL dan menggunakannya untuk menampilkan ID produk yang diminta.

### 3. Navigasi Programatik dengan `useNavigate`

Kadang-kadang kita ingin menavigasi ke rute lain secara programatik, misalnya setelah submit form atau event lainnya. React Router menyediakan hook **`useNavigate`** untuk kebutuhan ini.

#### Contoh Penggunaan `useNavigate`:

```jsx
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link, useNavigate } from 'react-router-dom';

function Home() {
  const navigate = useNavigate();

  const handleClick = () => {
    navigate('/about'); // Navigasi programatik ke halaman "About"
  };

  return (
    <div>
      <h2>Home Page</h2>
      <button onClick={handleClick}>Go to About</button>
    </div>
  );
}

function About() {
  return <h2>About Page</h2>;
}

function App() {
  return (
    <Router>
      <nav>
        <ul>
          <li><Link to="/">Home</Link></li>
          <li><Link to="/about">About</Link></li>
        </ul>
      </nav>

      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </Router>
  );
}

export default App;

#### Penjelasan:
- **`useNavigate()`**: Hook untuk navigasi programatik. Dalam contoh ini, kita menggunakan navigasi programatik untuk membawa pengguna dari halaman `Home` ke halaman `About` ketika tombol diklik.

### 4. Nested Routing (Rute Bersarang)

Nested routing memungkinkan kita merender komponen yang berbeda berdasarkan jalur bersarang (nested routes). Ini berguna jika kita memiliki beberapa halaman dalam satu struktur.

#### Contoh Nested Routes:

```jsx
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link, Outlet } from 'react-router-dom';

function Dashboard() {
  return (
    <div>
      <h2>Dashboard</h2>
      <nav>
        <ul>
          <li><Link to="profile">Profile</Link></li>
          <li><Link to="settings">Settings</Link></li>
        </ul>
      </nav>
      <Outlet /> {/* Tempat di mana nested route akan dirender */}
    </div>
  );
}

function Profile() {
  return <h2>Profile Page</h2>;
}

function Settings() {
  return <h2>Settings Page</h2>;
}

function App() {
  return (
    <Router>
      <nav>
        <ul>
          <li><Link to="/dashboard">Dashboard</Link></li>
        </ul>
      </nav>

      <Routes>
        <Route path="dashboard" element={<Dashboard />}>
          <Route path="profile" element={<Profile />} />
          <Route path="settings" element={<Settings />} />
        </Route>
      </Routes>
    </Router>
  );
}

export default App;

#### Penjelasan:
- **`<Outlet />`**: Digunakan untuk merender komponen nested route. Dalam contoh ini, jika pengguna membuka `/dashboard/profile`, maka `Profile` akan dirender di dalam komponen `Dashboard`.
- Rute bersarang memungkinkan pengelompokan halaman yang terkait dalam satu struktur URL.

### 5. Not Found Page (404 Error)

Untuk menangani kasus ketika pengguna mengakses rute yang tidak ada, kita dapat membuat halaman **404** khusus.

#### Contoh Halaman Not Found:

```jsx
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';

function Home() {
  return <h2>Home Page</h2>;
}

function About() {
  return <h2>About Page</h2>;
}

function NotFound() {
  return <h2>404 - Page Not Found</h2>;
}

function App() {
  return (
    <Router>
      <nav>
        <ul>
          <li><Link to="/">Home</Link></li>
          <li><Link to="/about">About</Link></li>
        </ul>
      </nav>

      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="*" element={<NotFound />} /> {/* Menangani rute tidak ditemukan */}
      </Routes>
    </Router>
  );
}

export default App;

#### Penjelasan:
- **`path="*"`**: Ini menangkap semua rute yang tidak cocok dengan rute yang telah ditentukan sebelumnya dan menampilkan halaman 404.

### Kesimpulan
- **React Router** memungkinkan kita membuat navigasi multi-halaman dalam aplikasi React dengan mudah tanpa melakukan reload halaman.
- Kita bisa menggunakan **Route**, **Link**, **useParams**, **useNavigate**, dan **Outlet** untuk mengelola rute dinamis, navigasi programatik

Posting Komentar

Lebih baru Lebih lama

Formulir Kontak