داده و کنترل‌گرهای مسیر

استقرارها را از ⁦app/api⁩ ارائه کنید، در یک صفحه واکشی کنید و استقرارهای جدید را ارسال کنید.

اپ این فصل در کنسول شما در حال اجراست. آن را با ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C باز کنید (ابتدا ویژگی‌های توسعه‌دهنده را فعال کنید)، سپس امتحانش کنید.
تماشای فصل3:32

در این فصل

  • کنترل‌گر مسیر
  • دریافت داده در صفحه
  • حالت‌های بارگذاری و خطا
  • ارسال جریانی

⁦Acme Deploys⁩ به داده‌های واقعی نیاز دارد. کنترل‌گرهای مسیر در کنار صفحه‌های شما در app/ قرار می‌گیرند، از APIهای وب Request و Response استفاده می‌کنند و با دستورهای text dev و text start اجرا می‌شوند. مبدأ آن‌ها با برنامه یکسان است، پس درخواست‌ها به تنظیم CORS نیاز ندارند.

کنترل‌گر مسیر

app/api/deployments/route.ts+10ts
افزوده‌شده: import { DEPLOYMENTS, createDeployment } from "../../../lib/deployments";افزوده‌شده: افزوده‌شده: export function GET(): Response {افزوده‌شده:   return Response.json(DEPLOYMENTS);افزوده‌شده: }افزوده‌شده: افزوده‌شده: export async function POST(req: Request): Promise<Response> {افزوده‌شده:   const deployment = createDeployment(await req.json());افزوده‌شده:   return Response.json(deployment, { status: 201 });افزوده‌شده: }

هنگامی که دستور text dev در حال اجرا است، آن را از پرامپت کنسول فراخوانی کنید:

await (await fetch("/api/deployments")).json()

دریافت داده در صفحه

داده‌ها را در یک افکت دریافت کنید و تا رسیدن داده‌ها یک <Spinner> نمایش دهید. کلید r داده‌ها را دوباره دریافت می‌کند؛ کلید n یک استقرار جدید ارسال می‌کند که با وضعیت در حال ساخت نمایش داده می‌شود و پس از پایان ساخت به وضعیت آماده تغییر می‌کند.

app/deployments/page.tsx+21-2tsx
حذف‌شده: import { DEPLOYMENTS } from "../../lib/deployments";افزوده‌شده: import { useEffect, useState } from "react";افزوده‌شده: import { Spinner, useInput } from "@textjs/app";افزوده‌شده: import type { Deployment } from "../../lib/deployments";export default function DeploymentsPage() {افزوده‌شده:   const [rows, setRows] = useState<Deployment[]>([]);افزوده‌شده:   const [loading, setLoading] = useState(true);افزوده‌شده: افزوده‌شده:   const refetch = async () => {افزوده‌شده:     setLoading(true);افزوده‌شده:     setRows(await (await fetch("/api/deployments")).json());افزوده‌شده:     setLoading(false);افزوده‌شده:   };افزوده‌شده:   useEffect(() => void refetch(), []);افزوده‌شده: افزوده‌شده:   useInput((e) => {افزوده‌شده:     if (e.input === "r") void refetch();افزوده‌شده:     if (e.input === "n") void fetch("/api/deployments", { method: "POST", body: "{}" }).then(refetch);افزوده‌شده:   });افزوده‌شده: افزوده‌شده:   if (loading) return <Spinner label="Loading deployments…" />;  return (    <Box className="flex-col">حذف‌شده:       {DEPLOYMENTS.map((d) => (افزوده‌شده:       {rows.map((d) => (        <Box key={d.id} className="flex-row h-1 gap-2">افزوده‌شده:           <Status status={d.status} />          …

حالت‌های بارگذاری و خطا

به‌جای مدیریت دستی وضعیت loading، فایل loading.tsx در کنار صفحه هنگام تعلیق آن نمایش داده می‌شود و فایل error.tsx هر خطایی را که صفحه پرتاب کند می‌گیرد. هر دو کامپوننت‌های معمولی هستند:

app/deployments/loading.tsxtsx
import { Spinner } from "@textjs/app";export default function Loading() {  return <Spinner label="Loading deployments…" />;}

ارسال جریانی

کنترل‌گرها می‌توانند یک ReadableStream برگردانند؛ گزارش‌های ساخت به همین روش خط‌به‌خط به داشبورد ارسال می‌شوند. برای رویدادهای ارسالی از سرور و پروکسی کردن یک دیمن محلی، به کنترل‌گرهای مسیر مراجعه کنید.

امتحان کنید

این Acme Deploys در پایان فصل است که در DevTools اجرا می‌شود. روی پد کلیک کنید، سپس از کلیدهای زیر استفاده کنید.

▼ 06 · داده و کنترل‌گرهای مسیر

باز کردن کنسول

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

برنامه در DevTools رندر می‌شود.ابتدا گزینهٔ «نمایش قابلیت‌ها برای توسعه‌دهندگان وب» را در تنظیمات Safari ← پیشرفته فعال کنید. سپس اینجا کلیک کنید و ⁦r⁩ را فشار دهید.

باز کردن در رایانه

این برنامه در کنسول DevTools رندر می‌شود که به مرورگر دسکتاپ نیاز دارد.

آزمون

2 پرسش

برای تکمیل فصل به همهٔ پرسش‌ها پاسخ دهید.

کنترل‌گرهای مسیر چه برمی‌گردانند؟

 

هنگام تعلیق مسیر کدام فایل نمایش داده می‌شود؟