الإدخال وخرائط المفاتيح

تنقّل بين عمليات النشر بلوحة المفاتيح وأضف طبقة مساعدة بالمفتاح ?.

يعمل تطبيق هذا الفصل في وحدة التحكم. افتحها باستخدام ⌘⌥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?

 

لماذا تنقر الصفحة قبل الكتابة؟