--- category: Sensors --- # useMagicKeys Reactive keys pressed state, with magical keys combination support. ## Usage ```ts import { useMagicKeys } from '@vueuse/core'; const { shift, space, a /* keys you want to monitor */ } = useMagicKeys(); watch(space, (v) => { if (v) console.log('space has been pressed'); }); watchEffect(() => { if (shift.value && a.value) console.log('Shift + A have been pressed'); }); ``` Check out [all the possible keycodes](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values). ### Combinations You can magically use combinations (shortcuts/hotkeys) by connecting keys with `+` or `_`. ```ts import { useMagicKeys } from '@vueuse/core'; const keys = useMagicKeys(); const shiftCtrlA = keys['Shift+Ctrl+A']; watch(shiftCtrlA, (v) => { if (v) console.log('Shift + Ctrl + A have been pressed'); }); ``` ```ts import { useMagicKeys } from '@vueuse/core'; const { Ctrl_A_B, space, alt_s /* ... */ } = useMagicKeys(); watch(Ctrl_A_B, (v) => { if (v) console.log('Control+A+B have been pressed'); }); ``` You can also use `whenever` function to make it shorter ```ts import { useMagicKeys, whenever } from '@vueuse/core'; const keys = useMagicKeys(); whenever(keys.shift_space, () => { console.log('Shift+Space have been pressed'); }); ``` ### Current Pressed keys A special property `current` is provided to representing all the keys been pressed currently. ```ts import { useMagicKeys, whenever } from '@vueuse/core'; const { current } = useMagicKeys(); console.log(current); // Set { 'control', 'a' } whenever( () => current.has('a') && !current.has('b'), () => console.log('A is pressed but not B'), ); ``` ### Key Aliasing ```ts import { useMagicKeys, whenever } from '@vueuse/core'; const { shift_cool } = useMagicKeys({ aliasMap: { cool: 'space', }, }); whenever(shift_cool, () => console.log('Shift + Space have been pressed')); ``` By default, we have some [preconfigured alias for common practices](https://github.com/vueuse/vueuse/blob/main/packages/core/useMagicKeys/aliasMap.ts). ### Conditionally Disable You might have some `` elements in your apps, and you don't want to trigger the magic keys handling when users focused on those inputs. There is an example of using `useActiveElement` and `logicAnd` to do that. ```ts import { useActiveElement, useMagicKeys, whenever } from '@vueuse/core'; import { logicAnd } from '@vueuse/math'; const activeElement = useActiveElement(); const notUsingInput = computed( () => activeElement.value?.tagName !== 'INPUT' && activeElement.value?.tagName !== 'TEXTAREA', ); const { tab } = useMagicKeys(); whenever(logicAnd(tab, notUsingInput), () => { console.log('Tab has been pressed outside of inputs!'); }); ``` ### Custom Event Handler ```ts import { useMagicKeys, whenever } from '@vueuse/core'; const { ctrl_s } = useMagicKeys({ passive: false, onEventFired(e) { if (e.ctrlKey && e.key === 's' && e.type === 'keydown') e.preventDefault(); }, }); whenever(ctrl_s, () => console.log('Ctrl+S have been pressed')); ``` > ⚠️ This usage is NOT recommended, please use with caution. ### Reactive Mode By default, the values of `useMagicKeys()` are `Ref`. If you want to use the object in the template, you can set it to reactive mode. ```ts import { useMagicKeys } from '@vueuse/core'; // ---cut--- const keys = useMagicKeys({ reactive: true }); ``` ```vue ``` ## Type Declarations ```ts export interface UseMagicKeysOptions { /** * Returns a reactive object instead of an object of refs * * @default false */ reactive?: Reactive; /** * Target for listening events * * @default window */ target?: MaybeRefOrGetter; /** * Alias map for keys, all the keys should be lowercase * { target: keycode } * * @example { ctrl: "control" } * @default */ aliasMap?: Record; /** * Register passive listener * * @default true */ passive?: boolean; /** * Custom event handler for keydown/keyup event. * Useful when you want to apply custom logic. * * When using `e.preventDefault()`, you will need to pass `passive: false` to useMagicKeys(). */ onEventFired?: (e: KeyboardEvent) => void | boolean; } export interface MagicKeysInternal { /** * A Set of currently pressed keys, * Stores raw keyCodes. * * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key */ current: Set; } export type UseMagicKeysReturn = Readonly< Record> & MagicKeysInternal >; /** * Reactive keys pressed state, with magical keys combination support. * * @see https://vueuse.org/useMagicKeys */ export declare function useMagicKeys( options?: UseMagicKeysOptions, ): UseMagicKeysReturn; export { DefaultMagicKeysAliasMap } from './aliasMap'; ```