layout עם Box
בניית מעטפת לוח הבקרה עם Flexbox בתאים: סרגל עליון, סרגל צד וכרטיסים.
בפרק הזה
- סרגל עליון
- סרגל צד וכרטיסים
- רספונסיביות כברירת מחדל
המסוף הוא רשת של תאים. Text.js מסדר את ה-layout בעזרת Yoga, אותו מנוע flexbox שבו משתמש React Native, כך ש-<Box> פועל לפי כללי flexbox של CSS. יחידות המידה הן תאים: p-1 הוא ריווח פנימי של עמודה אחת ושורה אחת.
סרגל עליון
רוב המסכים בנויים כעמודה: סרגל בגובה שורה אחת, ואחריו כל השאר. יש לתת לסרגל גובה קבוע באמצעות h-1 ולתת לתוכן לתפוס את השטח שנותר באמצעות grow.
הוסר: 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 נותן לכל כרטיס חלק שווה בלי תלות בתוכן שלו.
נוסף: 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 מחשב מחדש את ה-layout ורק השורות שהשתנו נצבעות מחדש, כך שהצגת סרגל הצד או הסתרתו דורשת קריאת console.log אחת.
רספונסיביות כברירת מחדל
הרשת מתאימה את עצמה לחלונית DevTools המעוגנת. יש לגרור את המסוף כדי להרחיב או להגביה אותו, והכרטיסים יסתדרו מחדש. כשנדרשות נקודות שבירה, useBreakpoint() מחזיר את נקודת השבירה הנוכחית, בתאים.
התנסות
זו Acme Deploys בסוף הפרק, רצה ב-DevTools. יש ללחוץ על המשטח, ואז להשתמש במקשים שלמטה.
פתיחת המסוף
האפליקציה מרונדרת ב-DevTools.תחילה יש להפעיל את "הצגת תכונות למפתחי אתרים" בהגדרות Safari → מתקדם. אחר כך ללחוץ כאן וללחוץ על s.
פתיחה במחשב
האפליקציה הזו מרונדרת במסוף של DevTools, שדורש דפדפן במחשב.
בוחן
2 שאלותלהשלמת הפרק, יש לענות על כל השאלות.