Parallel Route — @slot — bir sahifada bir nechta kontent
Muammodan boshlaylik
Siz dashboard yozdingiz. Bir sahifada ikkita mustaqil qism bor:
- Chap panel — foydalanuvchilar ro'yxati (
/dashboard/users) - O'ng panel — statistika (
/dashboard/analytics)
Har ikkalasi o'z URL iga ega, mustaqil yuklanadi, mustaqil navigatsiya qiladi. Lekin bir sahifada ko'rinadi.
Oddiy routing bilan bu qiyin — bitta page.tsx da ikki xil URL ni boshqarib bo'lmaydi. Parallel Route aynan shu uchun.
Qanday ishlaydi
@ bilan boshlanadigan papka — slot. Layout da children kabi props sifatida keladi:
app/dashboard/
├── layout.tsx
├── page.tsx
├── @users/
│ └── page.tsx ← /dashboard da ko'rsatiladi
└── @analytics/
└── page.tsx ← /dashboard da ko'rsatiladi
// app/dashboard/layout.tsx
export default function DashboardLayout({
children,
users,
analytics,
}: {
children: React.ReactNode
users: React.ReactNode // @users/page.tsx
analytics: React.ReactNode // @analytics/page.tsx
}) {
return (
<div>
<div>{children}</div>
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr' }}>
<div>{users}</div>
<div>{analytics}</div>
</div>
</div>
)
}
@users va @analytics — URL ga kirmaydi. Faqat layout da slot sifatida ko'rinadi.
Har bir slot mustaqil
Har bir slot o'z loading.tsx, error.tsx va page.tsx ga ega bo'lishi mumkin:
app/dashboard/
├── @users/
│ ├── page.tsx
│ ├── loading.tsx ← faqat users slot uchun
│ └── error.tsx ← faqat users slot uchun
└── @analytics/
├── page.tsx
├── loading.tsx ← faqat analytics slot uchun
└── error.tsx
@users sekin yuklanayotganda — @analytics allaqachon ko'ringan bo'ladi. Ikkalasi mustaqil.
default.tsx — slot uchun fallback
Foydalanuvchi /dashboard/settings ga o'tganda — @users va @analytics slotlari uchun settings/page.tsx yo'q. Next.js nima ko'rsatadi?
Agar default.tsx bo'lsa — uni ko'rsatadi. Bo'lmasa — 404.
// app/dashboard/@users/default.tsx
export default function UsersDefault() {
return null // hech narsa ko'rsatmaslik
}
// app/dashboard/@analytics/default.tsx
export default function AnalyticsDefault() {
return null
}
default.tsx — slot uchun "bo'sh holat". Navigatsiya qilinganda slot nima ko'rsatishini bilmasa — default.tsx ishlatiladi.
Amaliy misol — tab navigatsiya
Parallel Route bilan tab navigatsiya — har bir tab o'z URL iga ega:
app/dashboard/
├── layout.tsx
├── page.tsx
├── @team/
│ ├── default.tsx
│ └── page.tsx → /dashboard (team tab)
└── @revenue/
├── default.tsx
└── page.tsx → /dashboard (revenue tab)
// app/dashboard/layout.tsx
import Link from 'next/link'
export default function DashboardLayout({ children, team, revenue }) {
return (
<div>
<nav>
<Link href="/dashboard">Jamoa</Link>
<Link href="/dashboard/revenue">Daromad</Link>
</nav>
<div>
{team}
{revenue}
</div>
</div>
)
}
Parallel Route vs oddiy komponent
Ko'pchilik savol beradi: "Nima uchun Parallel Route? Oddiy komponent import qilsam bo'lmaydimi?"
// Oddiy komponent — bu ham ishlaydi
export default function Dashboard() {
return (
<div>
<UserStats />
<Analytics />
</div>
)
}
Parallel Route kerak bo'lgan holat:
- Har bir qism o'z URL iga ega bo'lishi kerak
- Har bir qism mustaqil navigatsiya qilishi kerak
- Har bir qism mustaqil loading/error holatiga ega bo'lishi kerak
Agar bular kerak bo'lmasa — oddiy komponent yetarli.
Tez-tez uchraydigan xatolar
1. default.tsx yo'q — navigatsiyada 404
// ❌ — /dashboard/settings ga o'tganda @users slot 404
app/dashboard/@users/page.tsx (default.tsx yo'q)
// ✅
app/dashboard/@users/default.tsx (null qaytaradi)
2. Slot nomini layout props da noto'g'ri yozish
// ❌ — @team papkasi, lekin props da "users"
export default function Layout({ children, users }) {
// users — undefined, @team ko'rinmaydi
}
// ✅ — papka nomi bilan bir xil
export default function Layout({ children, team }) {
// team — @team/page.tsx kontenti
}
3. Slot URL ga kiradi deb o'ylash
// @users papkasi — URL ga kirmaydi
// ❌ — bunday URL yo'q
/dashboard/@users
// ✅ — to'g'ri URL
/dashboard
Xulosa
Parallel Route — bir sahifada bir nechta mustaqil slot.
@slot_nomi → papka nomi, URL ga kirmaydi
layout props → slot nomi bilan keladi (children kabi)
default.tsx → navigatsiyada slot nima ko'rsatishini bilmasa
Qachon kerak: har bir qism o'z URL i, mustaqil loading/error, mustaqil navigatsiya. Qachon kerak emas: oddiy komponent import qilish yetarli bo'lsa.
Keyingi dars
27-dars: Intercepting Route — (.) (..) — modal pattern
Sahifani to'liq yuklamasdan modal ko'rsatish — Instagram kabi foto modal, Next.js da qanday amalga oshiriladi.