קלט ומפות מקשים

ניווט בין פריסות באמצעות המקלדת והוספת שכבת עזרה עם ?.

האפליקציה של הפרק הזה רצה במסוף. יש לפתוח אותו עם ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (תחילה להפעיל תכונות למפתחים), ואז לנסות אותה.
צפייה בפרק3:25

בפרק הזה

  • `useInput`
  • מפות מקשים
  • שכבת העזרה
  • מיקוד

הקשות מקשים מגיעות לאפליקציה דרך שדה קלט מוסתר בדף, ולכן הדף צריך להיות במיקוד. לכן כל אפליקציית Text.js מבקשת ללחוץ קודם על הדף. כשהדף במיקוד, כל הקשה על מקש מועברת ל-React.

useInput

useInput הוא ההוק ברמה הנמוכה ששימש עד כה. הוא מקבל KeyEvent עם key מנורמל ("up", "return", "escape"), התו שהוקלד ב-input, וכן ctrl, alt, shift ו-meta.

useInput((e) => {  if (e.ctrl && e.key === "k") openPalette();});

כדי למנוע ממקש להגיע למטפלים בהמשך העץ, יש לקרוא ל-e.stopPropagation().

מפות מקשים

כשבמסך יש יותר מכמה מקשים, יש לתאר אותם באמצעות useKeymap. שיוכים הם מחרוזות: "up, k" הוא אחד משני המקשים, "g g" הוא רצף, "ctrl+k" הוא צירוף מקשים. שיוכים עם תוויות מופיעים גם ב-<KeyHelp>, ב-<KeyHints> ובלוח הפקודות.

app/deployments/page.tsx+31tsx
נוסף: import { useState } from "react";נוסף: import { Box, KeyHelp, Text, useKeymap } from "@textjs/app";נוסף: import { DEPLOYMENTS } from "../../lib/deployments";נוסף: נוסף: export default function DeploymentsPage() {נוסף:   const [index, setIndex] = useState(0);נוסף:   const [open, setOpen] = useState(false);נוסף:   const move = (by: number) => setIndex((i) => Math.max(0, Math.min(DEPLOYMENTS.length - 1, i + by)));נוסף: נוסף:   useKeymap({נוסף:     "up, k": { label: "Previous deployment", run: () => move(-1) },נוסף:     "down, j": { label: "Next deployment", run: () => move(1) },נוסף:     enter: { label: "Toggle details", run: () => setOpen((o) => !o) },נוסף:     "g g": { label: "First deployment", run: () => setIndex(0) },נוסף:   });נוסף: נוסף:   return (נוסף:     <Box className="flex-row grow p-1 gap-2">נוסף:       <Box className="flex-col grow">נוסף:         {DEPLOYMENTS.map((d, i) => (נוסף:           <Box key={d.id} className="flex-row h-1 gap-2 px-1" backgroundColor={i === index ? "selection" : undefined}>נוסף:             <Text>{i === index ? "›" : " "}</Text>נוסף:             <Text bold={i === index} wrap="truncate-end">{d.commit}</Text>נוסף:           </Box>נוסף:         ))}נוסף:       </Box>נוסף:       {open && <Details deployment={DEPLOYMENTS[index]} />}נוסף:       <KeyHelp />נוסף:     </Box>נוסף:   );נוסף: }

DEPLOYMENTS הוא בינתיים מערך רגיל בקובץ lib/deployments.ts. פרק 6 מעביר אותו אל מאחורי מטפל נתיב.

שכבת העזרה

<KeyHelp /> מאזין ל-? ופותח חלון מודאלי שמציג בקבוצות את כל השיוכים בעלי התוויות שפעילים כרגע. יש ללחוץ על ? במסוף, ואז על ? או על q כדי לסגור אותו. שיוכים בתוך חלון מודאלי לוכדים את המיקוד, ולכן הרשימה שמתחתיו מפסיקה להגיב עד שהוא נסגר.

מיקוד

רכיבים כמו <Input>, <Select> ו-<Table> מקבלים מקשים רק כשהם במיקוד. Tab מעביר את המיקוד ביניהם; useFocus() ו-useFocusManager() מאפשרים להעביר אותו באופן יזום.

התנסות

זו Acme Deploys בסוף הפרק, רצה ב-DevTools. יש ללחוץ על המשטח, ואז להשתמש במקשים שלמטה.

▼ 04 · קלט ומפות מקשים

פתיחת המסוף

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

האפליקציה מרונדרת ב-DevTools.תחילה יש להפעיל את "הצגת תכונות למפתחי אתרים" בהגדרות Safari → מתקדם. אחר כך ללחוץ כאן וללחוץ על ↓.

פתיחה במחשב

האפליקציה הזו מרונדרת במסוף של DevTools, שדורש דפדפן במחשב.

בוחן

2 שאלות

להשלמת הפרק, יש לענות על כל השאלות.

In useKeymap, what does the binding "g g" mean?

 

למה יש ללחוץ על הדף לפני ההקלדה?