KembaliBelajar Full-stack Dengan React Router v7
Pembahasan

Routing Nested

Anggap halaman /about itu punya subhalaman /about/team. Lo bisa bikin route-nya kayak gini:

app/routes.ts
import { type RouteConfig, index, route } from '@react-router/dev/routes';

export default [
  index('routes/home.tsx'),
  route('about', 'routes/about.tsx', [
    route('team', 'routes/about/team.tsx')
  ]),
] satisfies RouteConfig;

Kalo lo akses /about/team, lo bakal liat tampilan yang sama kayak /about. Ini karena route /about dianggap sebagai parent dari route /about/team. Untuk itu, lo perlu nge-render component <Outlet /> di dalam component /about supaya subhalaman tersebut bisa ditampilin.

app/routes/about.tsx
import { Outlet } from 'react-router';

export default function About() {
  return (
    <div>
      <h1>About Page</h1>
      <Outlet />
    </div>
  );
}

Secara teknis, route module /about/team ini dibungkus di dalam route module /about. Kayak gini kira-kira:

Struktur Route
<About>
  <Team />
</About>

Ini berarti route module /about juga bisa kita dijadikan sebagai layout untuk subhalaman /about/team dan subhalaman lainnya yang ada di bawahnya. Ini bermanfaat banget ketika lo mau bikin semacam sub-menu berupa sidebar atau tab yang ada di dalam halaman /about.

Ini juga berarti, dalam konteks ini, lo nggak perlu naruh konten halaman /about di dalam file routes/about.tsx. File tersebut bisa dijadiin sebagai layout aja, dan lo bisa bikin file baru yang khusus buat konten halaman /about di dalam file app/routes/about-index.tsx, misalnya.

Jadinya kayak gini:

app/routes.ts
import { type RouteConfig, index, route } from '@react-router/dev/routes';

export default [
  index('routes/home.tsx'),
  route('about', 'routes/about.tsx', [
    //           ^^^ ini yang jadi layout subhalaman /about
    index('routes/about-index.tsx'), // ini yang jadi konten halaman /about
    route('team', 'routes/about-team.tsx')
  ]),
] satisfies RouteConfig;

Untuk isi file app/routes/about.tsx, lo bisa bikin kayak gini:

app/routes/about.tsx
import { Outlet } from 'react-router';

export default function About() {
  return (
    <div>
      <h1>About</h1>
      <nav>
        {/* navigasi di sini */}
      </nav>
      <Outlet />
    </div>
  );
}

Sedangkan untuk file app/routes/about-index.tsx, lo bisa bikin kayak gini:

app/routes/about-index.tsx
export default function AboutIndex() {
  return <p>Ini adalah halaman About</p>;
}

Dan untuk file app/routes/about-team.tsx, lo bisa bikin kayak gini:

app/routes/about-team.tsx
export default function AboutTeam() {
  return <p>Ini adalah halaman Tim</p>;
}

In case lo nggak mau bikin nested route dengan struktur kayak gini, lo bisa bikin pake cara yang lebih simpel:

app/routes.ts
import { type RouteConfig, index, route } from '@react-router/dev/routes';

export default [
  index('routes/home.tsx'),
  route('about', 'routes/about.tsx'),
  route('about/team', 'routes/about-team.tsx'),
] satisfies RouteConfig;

Kalo kayak gini, file app/routes/about.tsx nggak perlu pake <Outlet /> lagi, karena nggak ada subhalaman yang di-render di dalamnya dan kedua route tersebut nggak punya parent-child relationship. That's perfectly fine kalo lo butuhnya kayak gini.

If it works, it works!

Progres kursus

Sudah paham pelajaran ini?

Tandai selesai untuk menyimpan progresmu di kursus ini.

Diskusi

0 komentar

Belum ada komentar.

Mulai diskusi