跳到内容

useMagicKeys

分类
导出大小
1.08 kB
上次更改
5 天前

具有神奇按键组合支持的响应式按键按下状态。

演示

按下以下按键进行测试
V
u
e
U
s
e
Shift
Vue
Use
已按下的按键

用法

js
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')
})

查看所有可能的键码

组合

您可以使用 +_ 连接按键,神奇地使用组合键(快捷键/热键)。

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')
})

您还可以使用 whenever 函数来使其更简洁

ts
import { useMagicKeys, whenever } from '@vueuse/core'

const keys = useMagicKeys()

whenever(keys.shift_space, () => {
  console.log('Shift+Space have been pressed')
})

当前按下的按键

提供了一个特殊的属性 current 来表示当前已按下的所有按键。

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'),
)

按键别名

ts
import { useMagicKeys, whenever } from '@vueuse/core'

const { shift_cool } = useMagicKeys({
  aliasMap: {
    cool: 'space',
  },
})

whenever(shift_cool, () => console.log('Shift + Space have been pressed'))

默认情况下,我们为常见做法预配置了一些别名

有条件地禁用

您的应用中可能有一些 <input /> 元素,并且您不希望在用户聚焦于这些输入框时触发神奇按键处理。这里有一个使用 useActiveElementlogicAnd 来实现此目的的示例。

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!')
})

自定义事件处理程序

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'))

⚠️ 不建议使用此用法,请谨慎使用。

响应式模式

默认情况下,useMagicKeys() 的值是 Ref<boolean>。如果您想在模板中使用该对象,可以将其设置为响应式模式。

ts
const keys = useMagicKeys({ reactive: true })
vue
<template>
  <div v-if="keys.shift">
    You are holding the Shift key!
  </div>
</template>

类型声明

显示类型声明
typescript
export interface UseMagicKeysOptions<Reactive extends boolean> {
  /**
   * Returns a reactive object instead of an object of refs
   *
   * @default false
   */
  reactive?: Reactive
  /**
   * Target for listening events
   *
   * @default window
   */
  target?: MaybeRefOrGetter<EventTarget>
  /**
   * Alias map for keys, all the keys should be lowercase
   * { target: keycode }
   *
   * @example { ctrl: "control" }
   * @default <predefined-map>
   */
  aliasMap?: Record<string, string>
  /**
   * 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://mdn.org.cn/en-US/docs/Web/API/KeyboardEvent/key
   */
  current: Set<string>
}
export type UseMagicKeysReturn<Reactive extends boolean> = Readonly<
  Omit<
    Reactive extends true
      ? Record<string, boolean>
      : Record<string, ComputedRef<boolean>>,
    keyof MagicKeysInternal
  > &
    MagicKeysInternal
>
/**
 * Reactive keys pressed state, with magical keys combination support.
 *
 * @see https://vueuse.org.cn/useMagicKeys
 */
export declare function useMagicKeys(
  options?: UseMagicKeysOptions<false>,
): UseMagicKeysReturn<false>
export declare function useMagicKeys(
  options: UseMagicKeysOptions<true>,
): UseMagicKeysReturn<true>
export { DefaultMagicKeysAliasMap } from "./aliasMap"

SourceDemoDocs

贡献者

Anthony Fu
Anthony Fu
IlyaL
babu-ch
Fernando Fernández
sibbng
jp-liu
Thiago Silveira
丶远方
Hartmut
Jelf
matrixbirds
lavolpecheprogramma
Kasper Seweryn
Thomas Gerbet
zzw
webfansplz
Ciro Lo Sapio
Alex Kozack

更新日志

v12.8.0 on 3/5/2025
7432f - feat(types): 弃用 MaybeRefMaybeRefOrGetter,转而使用 Vue 的原生类型 (#4636)
v12.5.0 on 1/22/2025
b6947 - fix: 修复首次使用时的按键顺序问题 (#4505)
v12.4.0 on 1/10/2025
dd316 - feat: 尽可能在所有地方使用被动事件处理程序 (#4477)
v12.3.0 on 1/2/2025
59f75 - feat(toValue): 弃用 @vueuse/shared 中的 toValue,转而使用 Vue 的原生类型
v12.0.0-beta.1 on 11/21/2024
0a9ed - feat!: 删除 Vue 2 支持,优化捆绑包并进行清理 (#4349)
v10.7.0 on 12/5/2023
fccf2 - feat: 升级依赖项 (#3614)
v10.0.0-beta.4 on 4/13/2023
4d757 - feat(types)!: 将 MaybeComputedRef 重命名为 MaybeRefOrGetter

在 MIT 许可证下发布。