当前位置:首页 > 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实现键盘选择

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

第三方库集成

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

vue实现键盘选择

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


#### 无障碍访问增强

确保键盘导航符合 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实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组件…

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。ite…

vue nexttrick实现

vue nexttrick实现

Vue 中 nextTick 的实现原理 nextTick 是 Vue 提供的一个异步方法,用于在下次 DOM 更新循环结束之后执行延迟回调。它利用了 JavaScript 的事件循环机制,确保回调在…

vue实现字幕

vue实现字幕

Vue 实现字幕功能 在 Vue 中实现字幕功能可以通过动态绑定数据和 CSS 动画来实现。以下是具体实现方法: 1. 基础字幕组件 创建一个字幕组件,通过 v-model 或 props 接收字…

vue搜索功能实现

vue搜索功能实现

Vue搜索功能实现方法 在Vue中实现搜索功能可以通过多种方式完成,以下是几种常见的方法: 使用计算属性实现搜索 计算属性非常适合处理需要根据输入值动态过滤数据的情况。创建一个计算属性,根据搜索关键…

vue实现结算页面

vue实现结算页面

Vue 实现结算页面的核心步骤 数据绑定与表单验证 使用 Vue 的 v-model 绑定表单数据,例如收货地址、支付方式等。通过 Vue 的 computed 属性计算总价,结合 v-if 或 v-…