You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Svelte中on:keydown正确用法及标签切换失效问题排查

问题原因及修复方案

1. 缺少事件分发器初始化

你的Tabs组件中使用了dispatch方法,但未从Svelte导入并创建事件分发器,导致tabChange事件根本无法触发。

修复:在Tabs组件顶部添加脚本代码:

<script>
  import { createEventDispatcher } from 'svelte';
  const dispatch = createEventDispatcher();
  
  export let items;
  export let activeItem;
</script>

2. 父组件未正确更新activeItem状态

即便事件成功触发,如果父组件的tabChange函数没有更新activeItem的值,子组件的选中状态也不会变化。

父组件脚本需确保更新状态:

<script>
  import Tabs from './Tabs.svelte';
  
  let items = ['标签1', '标签2', '标签3'];
  let activeItem = items[0];
  
  function tabChange(event) {
    // 必须更新activeItem,子组件才会同步选中状态
    activeItem = event.detail;
  }
</script>

3. keydown事件逻辑过于宽泛(可选优化)

当前代码按下任意键都会触发切换,不符合常规交互逻辑,建议只响应Enter或Space键:

on:keydown={(e) => {
  if (e.key === 'Enter' || e.key === ' ') {
    e.preventDefault();
    dispatch("tabChange", item);
  }
}}

4. 可选:增强可访问性(无障碍优化)

给li元素添加aria-selected属性,符合无障碍标准:

<li
  tabindex="0"
  aria-selected={item === activeItem}
  on:click={() => dispatch("tabChange", item)}
  on:keydown={(e) => {
    if (e.key === 'Enter' || e.key === ' ') {
      e.preventDefault();
      dispatch("tabChange", item);
    }
  }}
>

内容的提问来源于stack exchange,提问作者comm1ted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:33:19