التوجيه
قسّم التطبيق إلى مسارات بتخطيط مشترك، وروابط باختصارات وسجلّ تنقّل.
في هذا الفصل
- الملفات مسارات
- تخطيط مشترك
- الرجوع
- المقاطع الديناميكية
يربط App Router الملفات في app/ بعناوين URL، وفقًا لأعراف App Router في Next.js. يظل شريط عناوين المتصفح وسجلّه متزامنين، لذا تعمل وظائف الرجوع والتقدم والروابط العميقة أثناء عرض واجهة المستخدم في وحدة التحكم.
الملفات مسارات
انقل القائمة إلى مسار خاص بها وأضف صفحة إعدادات:
app/ layout.tsx page.tsx → /المضاف: deployments/المضاف: page.tsx → /deploymentsالمضاف: [id]/page.tsx → /deployments/dpl_8fK2المضاف: settings/المضاف: page.tsx → /settingsتخطيط مشترك
يغلّف الملف 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() في التخطيط:
المحذوف: 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 سؤالانأجب عن كل سؤال لإكمال الفصل.