ניתוב
פיצול האפליקציה לנתיבים עם layout משותף, קישורים עם קיצורי מקשים והיסטוריה.
בפרק הזה
- קבצים הם נתיבים
- layout משותף
- חזרה אחורה
- מקטעים דינמיים
App Router ממפה קבצים בתיקייה app/ לכתובות URL, לפי המוסכמות של Next.js App Router. שורת הכתובת וההיסטוריה של הדפדפן נשארות מסונכרנות, כך שניווט אחורה וקדימה וקישורים עמוקים פועלים בזמן שממשק המשתמש מרונדר במסוף.
קבצים הם נתיבים
יש להעביר את הרשימה לנתיב משלה ולהוסיף דף הגדרות:
app/ layout.tsx page.tsx → /נוסף: deployments/נוסף: page.tsx → /deploymentsנוסף: [id]/page.tsx → /deployments/dpl_8fK2נוסף: settings/נוסף: page.tsx → /settingslayout משותף
layout.tsx עוטף כל דף ושומר על המצב שלו לאורך הניווט. יש למקם בו את הסרגל העליון ואת הניווט.
נוסף: import type { ReactNode } from "react";נוסף: import { Box, Spacer, Text } from "@textjs/app";נוסף: import Link from "@textjs/app/link";נוסף: import { usePathname } from "@textjs/app/navigation";נוסף: נוסף: export const metadata = { title: { default: "Acme Deploys", template: "%s · Acme" } };נוסף: נוסף: export default function RootLayout({ children }: { children?: ReactNode }) {נוסף: const pathname = usePathname();נוסף: return (נוסף: <Box className="flex-col grow">נוסף: <Box className="flex-row h-1 px-1 gap-2">נוסף: <Text bold>▼ Acme</Text>נוסף: <Text color="subtle">{`acme.local${pathname === "/" ? "" : pathname}`}</Text>נוסף: <Spacer />נוסף: </Box>נוסף: <Box className="flex-row h-1 px-1 gap-3">נוסף: <Link href="/" shortcut="1">Overview</Link>נוסף: <Link href="/deployments" shortcut="2">Deployments</Link>נוסף: <Link href="/settings" shortcut="3">Settings</Link>נוסף: </Box>נוסף: <Box className="flex-col grow p-1">{children}</Box>נוסף: </Box>נוסף: );נוסף: }shortcut מקשר מקש יחיד לקישור. יש ללחוץ על 1, 2 ו-3 במסוף; באפליקציה אמיתית, כתובת ה-URL הייתה משתנה עם כל אחד מהם.
חזרה אחורה
useRouter() מאפשר ניווט מתוך קוד. יש לקשר את Backspace ל-router.back() בתוך ה-layout:
הוסר: import { Box, Spacer, Text } from "@textjs/app";נוסף: import { Box, Spacer, Text, useInput } from "@textjs/app";import Link from "@textjs/app/link";הוסר: import { usePathname } from "@textjs/app/navigation";נוסף: import { usePathname, useRouter } from "@textjs/app/navigation";export default function RootLayout({ children }: { children?: ReactNode }) { const pathname = usePathname();נוסף: const router = useRouter();נוסף: נוסף: useInput((e) => {נוסף: if (e.key === "backspace") router.back();נוסף: });מקטעים דינמיים
תיקיות [id] מקבלות את הערך שלהן ב-params:
import { Text, type PageProps } from "@textjs/app";export default function DeploymentPage({ params }: PageProps<{ id: string }>) { return <Text bold>{params.id}</Text>;}באירוח סטטי, מקטעים דינמיים כמו זה דורשים שכתוב ל-index.html. פרק 10 עוסק בכך.
התנסות
זו Acme Deploys בסוף הפרק, רצה ב-DevTools. יש ללחוץ על המשטח, ואז להשתמש במקשים שלמטה.
פתיחת המסוף
האפליקציה מרונדרת ב-DevTools.תחילה יש להפעיל את "הצגת תכונות למפתחי אתרים" בהגדרות Safari → מתקדם. אחר כך ללחוץ כאן וללחוץ על 2.
פתיחה במחשב
האפליקציה הזו מרונדרת במסוף של DevTools, שדורש דפדפן במחשב.
בוחן
2 שאלותלהשלמת הפרק, יש לענות על כל השאלות.