当前位置:首页 > VUE

vue实现键盘选择

2026-02-17 08:50:26VUE

Vue 实现键盘选择功能

在 Vue 中实现键盘选择功能通常用于列表导航、下拉菜单或表格操作。以下是几种常见实现方式:

基础键盘事件监听

通过 @keydown 监听键盘事件,结合 v-for 渲染的列表项实现选择:

<template>
  <div @keydown.down="moveDown" @keydown.up="moveUp" tabindex="0">
    <div 
      v-for="(item, index) in items" 
      :key="item.id"
      :class="{ 'active': activeIndex === index }"
    >
      {{ item.text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [...],
      activeIndex: 0
    }
  },
  methods: {
    moveDown() {
      this.activeIndex = Math.min(this.activeIndex + 1, this.items.length - 1)
    },
    moveUp() {
      this.activeIndex = Math.max(this.activeIndex - 1, 0)
    }
  }
}
</script>

使用自定义指令

创建可复用的键盘选择指令:

Vue.directive('key-select', {
  bind(el, binding) {
    el.tabIndex = 0
    el.addEventListener('keydown', (e) => {
      const items = el.querySelectorAll('[data-selectable]')
      let current = [...items].findIndex(item => item.classList.contains('active'))

      if (e.key === 'ArrowDown') {
        current = Math.min(current + 1, items.length - 1)
        binding.value(current)
      } else if (e.key === 'ArrowUp') {
        current = Math.max(current - 1, 0)
        binding.value(current)
      }
    })
  }
})

组合式 API 实现

在 Vue 3 中使用组合式 API:

import { ref, onMounted } from 'vue'

export function useKeyboardSelection(items) {
  const selectedIndex = ref(0)

  const handleKeyDown = (e) => {
    if (e.key === 'ArrowDown') {
      selectedIndex.value = Math.min(selectedIndex.value + 1, items.value.length - 1)
    } else if (e.key === 'ArrowUp') {
      selectedIndex.value = Math.max(selectedIndex.value - 1, 0)
    }
  }

  onMounted(() => {
    window.addEventListener('keydown', handleKeyDown)
  })

  return { selectedIndex }
}

第三方库集成

对于复杂场景,可以使用专门处理键盘导航的库:

  1. 安装 vue-keyboardhotkeys-js

    npm install hotkeys-js
  2. 集成示例:

    
    import hotkeys from 'hotkeys-js'

export default { mounted() { hotkeys('up,down', (e, handler) => { if (handler.key === 'down') this.moveDown() if (handler.key === 'up') this.moveUp() }) }, beforeDestroy() { hotkeys.unbind('up,down') } }

vue实现键盘选择


#### 无障碍访问增强

确保键盘导航符合 WAI-ARIA 标准:

```html
<div role="listbox" aria-activedescendant={`item-${activeIndex}`}>
  <div 
    v-for="(item, index) in items"
    :id="`item-${index}`"
    role="option"
    :aria-selected="activeIndex === index"
  >
    {{ item.text }}
  </div>
</div>

以上方法可根据具体需求组合使用,核心要点是正确监听键盘事件、管理选中状态,并确保组件可获得焦点。

标签: 键盘vue
分享给朋友:

相关文章

vue树形实现

vue树形实现

Vue 树形组件实现方法 使用递归组件实现树形结构 递归组件是 Vue 中实现树形结构的常见方法。通过组件调用自身的方式,可以轻松构建多层嵌套的树形结构。 <template> &l…

vue实现类别

vue实现类别

Vue 实现类别的几种方法 在 Vue 中实现类别功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-bind:class 动态绑定类名 通过对象语法或数组语法动态绑定类名,根据条件添加或移…

vue实现监听

vue实现监听

监听数据变化 在Vue中,可以通过watch选项或$watch方法监听数据的变化。watch适用于组件选项内声明式监听,$watch适用于动态监听。 // 选项式API export default…

vue 简单实现

vue 简单实现

以下是 Vue 的简单实现示例,涵盖基础模板、数据绑定、方法及生命周期: 基础模板与数据绑定 <div id="app"> <p>{{ message }}</p&…

vue filter 实现

vue filter 实现

在 Vue.js 中,过滤器(Filter)是一种用于文本格式化的功能,可以在模板中直接使用。以下是实现过滤器的详细方法: 全局过滤器注册 通过 Vue.filter 方法注册全局过滤器,可在所有组…

vue实现权限

vue实现权限

Vue 实现权限管理的方法 在 Vue 项目中实现权限管理通常涉及路由控制、按钮权限和接口权限。以下是几种常见的实现方式: 路由权限控制 通过动态路由的方式,根据用户权限加载不同的路由配置。可以使用…