چیدمان با Box

ساختار داشبورد را با Flexbox در سلول‌ها بسازید: یک نوار بالا، یک نوار کناری و کارت‌ها.

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

در این فصل

  • نوار بالایی
  • نوار کناری و کارت‌ها
  • واکنش‌گرا به‌صورت پیش‌فرض

کنسول شبکه‌ای از سلول‌هاست. Text.js چیدمان آن را با Yoga انجام می‌دهد، همان موتور flexbox که ⁦React Native⁩ از آن استفاده می‌کند، پس <Box> از قواعد flexbox در CSS پیروی می‌کند. واحدها سلول هستند: p-1 یعنی یک ستون و یک ردیف فاصلهٔ داخلی.

نوار بالایی

بیشتر صفحه‌ها یک ستون هستند: یک نوار تک‌ردیفی، سپس بقیهٔ محتوا. با h-1 به نوار ارتفاع ثابت بدهید و با grow بگذارید محتوا فضای باقی‌مانده را بگیرد.

app/page.tsx+8-4tsx
حذف‌شده: import { Box, Text, useInput } from "@textjs/app";افزوده‌شده: import { Box, Spacer, Text, useInput } from "@textjs/app";export default function Page() {  return (حذف‌شده:     <Box className="flex-col border rounded px-2 py-1">حذف‌شده:       <Text bold>▼ Acme Deploys</Text>حذف‌شده:       <Text color="muted">Hello, console.</Text>افزوده‌شده:     <Box className="flex-col grow">افزوده‌شده:       <Box className="flex-row h-1 px-1 gap-2 shrink-0">افزوده‌شده:         <Text bold>▼ Acme</Text>افزوده‌شده:         <Text color="subtle">acme.local</Text>افزوده‌شده:         <Spacer />افزوده‌شده:       </Box>افزوده‌شده:       <Box className="flex-row grow">{/* sidebar + cards */}</Box>    </Box>  );}

<Spacer> کادری است که رشد می‌کند: هر چیزی پس از آن به لبهٔ راست رانده می‌شود.

یک نوار کناری با عرض ثابت و حاشیهٔ راست و سه کارت اضافه کنید که عرض باقی‌مانده را بین خود تقسیم می‌کنند. ترکیب basis-0 با grow به هر کارت، صرف‌نظر از محتوایش، سهم برابری می‌دهد.

app/page.tsx+31-1tsx
افزوده‌شده: const NAV = ["Overview", "Deployments", "Settings"];افزوده‌شده: افزوده‌شده: function Card({ title, value }: { title: string; value: string }) {افزوده‌شده:   return (افزوده‌شده:     <Box className="flex-col border rounded px-1 grow shrink basis-0" minWidth={14} minHeight={4}>افزوده‌شده:       <Text color="subtle">{title}</Text>افزوده‌شده:       <Text bold>{value}</Text>افزوده‌شده:     </Box>افزوده‌شده:   );افزوده‌شده: }افزوده‌شده: export default function Page() {افزوده‌شده:   const [sidebar, setSidebar] = useState(true);افزوده‌شده:   const [stacked, setStacked] = useState(false);افزوده‌شده: افزوده‌شده:   useInput((e) => {افزوده‌شده:     if (e.input === "s") setSidebar((v) => !v);افزوده‌شده:     if (e.input === "d") setStacked((v) => !v);افزوده‌شده:   });افزوده‌شده:   return (    <Box className="flex-col grow">      {/* top bar */}حذف‌شده:       <Box className="flex-row grow">{/* sidebar + cards */}</Box>افزوده‌شده:       <Box className="flex-row grow">افزوده‌شده:         {sidebar && (افزوده‌شده:           <Box className="flex-col w-18 shrink-0 border-r px-1 pt-1">افزوده‌شده:             {NAV.map((item) => <Text key={item}>{item}</Text>)}افزوده‌شده:           </Box>افزوده‌شده:         )}افزوده‌شده:         <Box className={stacked ? "flex-col grow gap-1 p-1" : "flex-row grow items-start gap-1 p-1"}>افزوده‌شده:           <Card title="Production" value="acme-web" />افزوده‌شده:           <Card title="Deployments" value="6 today" />افزوده‌شده:           <Card title="Build time" value="38s p50" />افزوده‌شده:         </Box>افزوده‌شده:       </Box>    </Box>  );}

کلیدهای s و d را در کنسول فشار دهید. Yoga چیدمان را دوباره محاسبه می‌کند و فقط ردیف‌های تغییریافته دوباره ترسیم می‌شوند، پس نمایش یا پنهان کردن نوار کناری فقط یک فراخوانی console.log هزینه دارد.

واکنش‌گرا به‌صورت پیش‌فرض

شبکه از پنل متصل DevTools پیروی می‌کند. کنسول را با کشیدن عریض‌تر یا بلندتر کنید تا کارت‌ها دوباره چیده شوند. وقتی به نقاط شکست نیاز دارید، هوک useBreakpoint() نقطهٔ شکست فعلی را بر حسب سلول برمی‌گرداند.

امتحان کنید

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

▼ 02 · چیدمان با Box

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

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

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

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

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

آزمون

2 پرسش

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

در کلاس‌های کمکی className، مقدار ⁦p-1⁩ چه معنایی دارد؟

 

کدام کلاس به یک کادر اجازه می‌دهد فضای باقی‌مانده را بگیرد؟