Skip to content

v-hotkey

简介

v-hotkey 指令用于监听键盘事件,并在事件发生时执行指定的回调函数,支持单个或多个按键的组合。

基本用法

v-hotkey 指令添加到需要监听键盘事件的元素上,并指定要监听的按键组合和回调函数:

点击查看代码
vue
<template>
  <a-card title="尝试按下单个按钮">
    <p v-hotkey="{ key: 'space', callback: handleSpace }">按 <kbd>Space</kbd></p>
    <p v-hotkey="{ key: 'w', callback: handleEnter }">按 <kbd>W</kbd></p>
  </a-card>
</template>

<script lang="ts" setup>
import { vHotkey } from '@cp-vuedir/core'
import { Notification } from '@arco-design/web-vue'

const handleSpace = () => Notification.info('Space 被按下!')
const handleEnter = () => Notification.info('W 被按下!')
</script>

<style scoped>
kbd {
  background: #333;
  color: #fff;
  padding: 3px 6px;
  border-radius: 4px;
}
</style>

多个按键组合

可以同时监听多个按键组合,当所有按键都被按下时,回调函数将被执行,按键间通过 + 符号连接:

点击查看代码
vue
<template>
  <a-card title="尝试按下多个按键">
    <ul>
      <li
        v-hotkey="{
          key: 'shift+space',
          callback: handleMore
        }"
      >
        按下:<kbd>shift</kbd> + <kbd>space</kbd>
      </li>
      <li
        v-hotkey="{
          key: 'ctrl+alt+delete',
          callback: handleCtrlAltDelete
        }"
      >
        按下:<kbd>ctrl</kbd> + <kbd>alt</kbd> + <kbd>delete</kbd>
      </li>
    </ul>
  </a-card>
</template>

<script lang="ts" setup>
import { vHotkey } from '@cp-vuedir/core'
import { Notification } from '@arco-design/web-vue'

const handleMore = () => Notification.success('你按下了shift+space')
const handleCtrlAltDelete = () => Notification.success('你按下了ctrl+alt+delete')
</script>

<style scoped>
ul {
  list-style: none;
  padding: 0;
}
li {
  background: #f1f1f1;
  padding: 10px;
  margin: 5px;
  border-radius: 6px;
}
kbd {
  background: #333;
  color: #fff;
  padding: 3px 6px;
  border-radius: 4px;
}
</style>

自动避免可编辑元素冲突

当指令所在的元素是可编辑元素(如 inputtextarea 等)时,会自动避免与可编辑元素的默认快捷键冲突,您可以放心使用。

点击查看代码
vue
<template>
  <a-card title="尝试在输入框聚焦时按下按键">
    <a-textarea placeholder="在这里输入,Enter 不会触发"></a-textarea>
    <a-input type="text" placeholder="输入框中也不会触发快捷键" />

    <p v-hotkey="{ key: 'enter', callback: handleEnter }">按 <kbd>Enter</kbd>(不在输入框时)</p>
  </a-card>
</template>

<script lang="ts" setup>
import { vHotkey } from '@cp-vuedir/core'
import { Message } from '@arco-design/web-vue'

const handleEnter = () => Message.info('Enter 被按下!')
</script>

<style scoped>
kbd {
  background: #333;
  color: #fff;
  padding: 3px 6px;
  border-radius: 4px;
}
</style>

API

属性名说明类型是否必选默认值
event
触发事件时的回掉函数
Function
value
监听的按键组合或单个按键,多个按键间通过 `+` 符号连接
String