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

Vuetify动态v-tabs切换异常:关闭Tab3后无法选中Tab1

问题现象

点击Tab3右侧的关闭按钮(X标记)后,预期Tab1会被选中,但实际没有任何标签处于选中状态。奇怪的是,通过按钮调用selectedTabFirstTab函数(内部逻辑同样是设置tab.value = 0)时,却能正常选中Tab1。

复现代码
<template>
  <v-app>
    <v-card>
      <v-tabs v-model="tab" bg-color="primary">
        <v-tab v-for="(t, index) in visibleTabs" :key="t">
          {{ t.name }}
          <v-icon x-small class="ml-2" @click="hideTab(t)">mdi-close</v-icon>
        </v-tab>
      </v-tabs>

      <v-card-text>
        <v-window v-model="tab">
          <v-window-item v-for="(t, index) in visibleTabs" :key="t">
            {{ t.name }}
          </v-window-item>
        </v-window>
      </v-card-text>
    </v-card>

    <v-btn @click="selectedTabFirstTab">选中第一个标签</v-btn>
  </v-app>
</template>

<script setup>
  import { ref, computed } from 'vue'

  const tab = ref(0)
  const allTabs = ref([
    { name: 'Tab1', visible: true },
    { name: 'Tab2', visible: true },
    { name: 'Tab3', visible: true },
  ])
  const visibleTabs = computed(() => allTabs.value.filter(tab => tab.visible))

  function hideTab(t) {
    t.visible = false
    // 关闭最后一个标签时应该重新选中第一个标签
    if (t.name === 'Tab3') {
      tab.value = 0 // 此处设置不生效
    }
  }

  function selectedTabFirstTab() {
    tab.value = 0 // 此处设置正常生效
  }
</script>
原因分析

点击关闭图标时,事件会向上冒泡到父元素<v-tab>的点击事件。此时<v-tabs>组件会尝试根据点击的tab项更新tab的值,但由于我们已经将Tab3设为不可见,visibleTabs数组长度发生变化,组件内部的索引计算出现异常,最终覆盖了我们手动设置的tab.value = 0,导致无标签选中。而按钮点击不存在事件冒泡问题,所以设置能正常生效。

解决方案

在关闭图标的点击事件上添加.stop修饰符阻止事件冒泡:

<v-icon x-small class="ml-2" @click.stop="hideTab(t)">mdi-close</v-icon>

修改后,点击关闭按钮不会触发<v-tab>的点击事件,手动设置的tab.value = 0就能正常生效,关闭Tab3后会自动选中Tab1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:22:18