التوجيه

قسّم التطبيق إلى مسارات بتخطيط مشترك، وروابط باختصارات وسجلّ تنقّل.

يعمل تطبيق هذا الفصل في وحدة التحكم. افتحها باستخدام ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (فعّل ميزات المطوّرين أولًا)، ثم جرّبه.
مشاهدة الفصل3:46

في هذا الفصل

  • الملفات مسارات
  • تخطيط مشترك
  • الرجوع
  • المقاطع الديناميكية

يربط ⁦App Router⁩ الملفات في app/ بعناوين URL، وفقًا لأعراف ⁦App Router⁩ في Next.js. يظل شريط عناوين المتصفح وسجلّه متزامنين، لذا تعمل وظائف الرجوع والتقدم والروابط العميقة أثناء عرض واجهة المستخدم في وحدة التحكم.

الملفات مسارات

انقل القائمة إلى مسار خاص بها وأضف صفحة إعدادات:

app/+5text
app/  layout.tsx  page.tsx                 → /المضاف:   deployments/المضاف:     page.tsx               → /deploymentsالمضاف:     [id]/page.tsx          → /deployments/dpl_8fK2المضاف:   settings/المضاف:     page.tsx               → /settings

تخطيط مشترك

يغلّف الملف layout.tsx كل صفحة ويحتفظ بحالته عبر التنقل. ضع فيه الشريط العلوي وعناصر التنقل.

app/layout.tsx+25tsx
المضاف: 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() في التخطيط:

app/layout.tsx+7-2tsx
المحذوف: 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:

app/deployments/[id]/page.tsxtsx
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. انقر اللوحة، ثم استخدم المفاتيح أدناه.

▼ 05 · التوجيه

فتح وحدة التحكم

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

يُعرض التطبيق في DevTools.فعّل أولًا «إظهار الميزات لمطوري الويب» في إعدادات Safari → متقدم. ثم انقر هنا واضغط 2.

الفتح على حاسوب مكتبي

يُعرض هذا التطبيق في وحدة تحكم DevTools، التي تتطلب متصفحًا على حاسوب مكتبي.

اختبار

2 سؤالان

أجب عن كل سؤال لإكمال الفصل.

أي ملف يُعرض عند ⁦/deployments⁩؟

 

ما الذي يبقى عند التنقّل بين الصفحات؟