useHeldKeys
Die Tasten, die gerade gehalten werden, geteilt von allen Abonnenten über einen einzigen Satz Window-Listener.
[]pnpm dlx shadcn@latest add https://hextaui.com/r/use-held-keys.jsonFügt den Hook und alles, wovon er abhängt, zu deinem Projekt hinzu.
Kopiere den folgenden Code und füge ihn in dein Projekt ein.
hooks/use-held-keys.ts Passe die Importpfade an dein Projekt-Setup an.
Nutze ihn für alles, was auf gehaltene statt gedrückte Tasten reagiert: Tasten, die sich eindrücken, Tastenkürzel-Hinweise, die erscheinen, solange du ⌘ hältst, oder einen Modifier, der ein Werkzeug umschaltet, wie Alt zum Duplizieren beim Ziehen.
Jede Komponente, die den Hook aufruft, teilt sich einen Store. Der erste Abonnent fügt passive keydown- und keyup-Listener an window hinzu, und der letzte, der sich abmeldet, entfernt sie. Eine Seite mit fünfzig lauschenden Tasten hat weiterhin ein Paar Listener.
Die Listener lesen Events nur. Sie rufen nie preventDefault auf und sitzen an window, nach den eigenen Handlern von React, sodass das Tippen in einem Feld nie verzögert oder verändert wird.
- Buchstaben und Ziffern stammen aus
event.code, der physischen Taste, sodass das Halten von Option+K auf einem Mac weiterhinkmeldet statt˚. - Tastenwiederholung wird ignoriert, und nichts rendert neu, solange eine Taste gehalten wird.
- macOS sendet kein
keyupfür andere Tasten, solange ⌘ gedrückt ist. Wird ⌘ losgelassen, behält der Store nur die noch gehaltenen Modifier, sodass Buchstaben nicht hängen bleiben können. - Alles wird losgelassen, wenn das Fenster den Fokus verliert oder der Tab verborgen wird. Ein Tastenkürzel, das die App wechselt, lässt nichts gehalten zurück.
Tasten, die sich drücken
<Kbd listen> ist auf diesem Hook gebaut. Jede Taste drückt sich nach unten, solange ihre Taste gehalten wird.
- Übergib
false, um das Lauschen zu beenden. Der Hook gibt dann eine leere Menge zurück und fügt keine Listener hinzu, sodass er bedenkenlos bedingungslos aufgerufen werden kann. - Die Menge wird nur ersetzt, wenn eine Taste gedrückt oder losgelassen wird, sodass ihre Identität als Memo- oder Effect-Abhängigkeit taugt.
- Für Tastenkürzel, die eine Aktion auslösen, nutze stattdessen
matchesHotkeyausHotkeyin einem keydown-Handler. Das Halten von Tasten dient der Zustandsanzeige, nicht dem Ausführen von Befehlen. - Auf dem Server und vor der Hydration ist die Menge leer.
| Prop | Typ | Standard |
|---|---|---|
enabledOb gelauscht wird. Bei false wird nichts angehängt. | boolean | – |
| Rückgabe | Beschreibung |
|---|---|
ReadonlySet<string> | Die Namen der Tasten, die gerade gehalten werden. |
Kbd und KbdGroup über ihre listen-Prop.