useHeldKeys
Las teclas que alguien mantiene pulsadas ahora mismo, compartidas por todos los suscriptores mediante un único conjunto de listeners en window.
[]pnpm dlx shadcn@latest add https://hextaui.com/r/use-held-keys.jsonAñade el hook y todo lo que necesita a tu proyecto.
Copia y pega el siguiente código en tu proyecto.
hooks/use-held-keys.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Úsalo para cualquier cosa que reaccione a teclas mantenidas en lugar de pulsadas: keycaps que se hunden, pistas de atajos que aparecen mientras mantienes ⌘, o un modificador que cambia una herramienta, como Alt para duplicar mientras arrastras.
Todos los componentes que llaman al hook comparten un único store. El primer suscriptor añade listeners pasivos de keydown y keyup a window, y el último en cancelar la suscripción los elimina. Una página con cincuenta keycaps escuchando sigue teniendo un solo par de listeners.
Los listeners solo leen eventos. Nunca llaman a preventDefault, y están en window, después de los manejadores propios de React, así que escribir en un campo nunca se retrasa ni cambia.
- Las letras y los dígitos vienen de
event.code, la tecla física, así que mantener Option+K en un Mac sigue informandoky no˚. - La repetición de teclas se ignora, y nada se vuelve a renderizar mientras se mantiene una tecla.
- macOS no envía
keyupde otras teclas mientras ⌘ está pulsada. Cuando se suelta ⌘, el store conserva solo los modificadores que siguen pulsados, así que las letras no pueden quedarse atascadas. - Todo se libera cuando la ventana pierde el foco o la pestaña se oculta. Un atajo que cambia de aplicación no deja nada retenido.
Keycaps que se hunden
<Kbd listen> está construido sobre este hook. Cada keycap se hunde mientras su tecla está pulsada.
- Pasa
falsepara dejar de escuchar. El hook devuelve entonces un conjunto vacío y no añade listeners, así que es barato llamarlo sin condiciones. - El conjunto solo se reemplaza cuando una tecla se pulsa o se suelta, así que su identidad sirve como dependencia de memo o de efecto.
- Para atajos que disparan una acción, usa
matchesHotkeydeHotkeyen un manejador de keydown. Mantener teclas es para mostrar estado, no para ejecutar comandos. - En el servidor, y antes de la hidratación, el conjunto está vacío.
| Prop | Tipo | Predeterminado |
|---|---|---|
enabledSi se debe escuchar. Cuando es false, no se adjunta nada. | boolean | – |
| Devuelve | Descripción |
|---|---|
ReadonlySet<string> | Los nombres de las teclas que están pulsadas ahora mismo. |
Kbd y KbdGroup mediante su prop listen.