入力とキーマップ

キーボードでデプロイ間を移動し、?のヘルプオーバーレイを追加します。

この章のアプリはコンソールで動作しています。⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥Cで開き(先に開発者向け機能を有効化)、試してください。
章の動画を見る3:25

この章の内容

  • `useInput`
  • キーマップ
  • ヘルプオーバーレイ
  • フォーカス

キー入力はページ上の非表示の入力要素を通じてアプリに届くため、ページにフォーカスが必要です。そのため、どのText.jsアプリも最初にページをクリックするよう求めます。フォーカスが当たると、押したキーがすべてReactに届きます。

useInput

useInput は、ここまで使ってきた低レベルのフックです。正規化された key("up"、"return"、"escape")、入力された文字を格納する input、および ctrl、alt、shift、meta を含む KeyEvent を受け取ります。

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の「設定」→「詳細」で「Webデベロッパ用の機能を表示」をオンにします。 次にここをクリックして、↓を押します。

デスクトップで開く

このアプリはDevToolsのコンソールに描画されるため、デスクトップブラウザーが必要です。

クイズ

2問

すべての問題に回答すると章を完了できます。

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

 

入力前にページをクリックするのはなぜですか?