useHeldKeys
今まさに押されているキー。1組の window リスナーを通じて、すべての購読者で共有されます。
Hold down any keys
[]pnpm dlx shadcn@latest add https://hextaui.com/r/use-held-keys.jsonフックと、その依存関係をプロジェクトに追加します。
次のコードをコピーしてプロジェクトに貼り付けてください。
hooks/use-held-keys.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
キーを押すことではなく押し続けることに反応するものに使います。たとえば、押し込まれるキーキャップ、⌘ を押している間に表示されるショートカットのヒント、ドラッグ中に Alt で複製するようなツールを切り替える修飾キーです。
フックを呼ぶすべてのコンポーネントは、1つのストアを共有します。最初の購読者が window にパッシブな keydown と keyup のリスナーを追加し、最後に購読を解除した購読者がそれらを削除します。50個のキーキャップが監視していても、リスナーは1組だけです。
リスナーはイベントを読み取るだけです。preventDefault は呼ばず、React 自身のハンドラーの後で window に置かれるため、フィールドへの入力が遅れたり変更されたりすることはありません。
- 文字と数字は物理キーである
event.codeから取得するため、Mac で Option+K を押していても、˚ではなくkが報告されます。 - キーリピートは無視され、キーが押されている間は何も再レンダリングされません。
- macOS では、⌘ が押されている間、他のキーの
keyupが送られません。⌘ が離されると、ストアはまだ押されている修飾キーだけを保持するため、文字が押されたまま残ることはありません。 - ウィンドウがフォーカスを失うか、タブが非表示になると、すべて解放されます。アプリを切り替えるショートカットで、押されたままになるものはありません。
押し込まれるキーキャップ
<Kbd listen> はこのフックの上に構築されています。各キーキャップは、そのキーが押されている間押し込まれます。
- リッスンを止めるには
falseを渡します。フックは空のセットを返してリスナーを追加しないので、無条件に呼び出してもコストはかかりません。 - セットはキーが押されたとき、または離されたときにだけ置き換えられるため、その同一性はメモ化や effect の依存配列として使えます。
- アクションを実行するショートカットには、代わりに keydown ハンドラーで
HotkeyのmatchesHotkeyを使ってください。キーの押下保持は状態を表示するためのもので、コマンドを実行するためのものではありません。 - サーバー上とハイドレーション前は、セットは空です。
| プロパティ | 型 | デフォルト |
|---|---|---|
enabledリッスンするかどうか。false の場合、何もアタッチされません。 | boolean | – |
| 戻り値 | 説明 |
|---|---|
ReadonlySet<string> | いま押されているキーの名前。 |
listen prop を通じた Kbd と KbdGroup。