当前位置:首页 > VUE

vue实现tab互斥

2026-02-18 21:33:51VUE

Vue 实现 Tab 互斥的方法

在 Vue 中实现 Tab 互斥(即同一时间只能有一个 Tab 处于激活状态)可以通过多种方式实现。以下是几种常见的方法:

使用 v-model 和 v-if

通过绑定一个 activeTab 变量,结合 v-ifv-show 控制 Tab 内容的显示与隐藏。

vue实现tab互斥

<template>
  <div>
    <button 
      v-for="tab in tabs" 
      :key="tab.id" 
      @click="activeTab = tab.id"
      :class="{ active: activeTab === tab.id }"
    >
      {{ tab.name }}
    </button>
    <div v-for="tab in tabs" :key="tab.id">
      <div v-if="activeTab === tab.id">
        {{ tab.content }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      activeTab: 'tab1',
      tabs: [
        { id: 'tab1', name: 'Tab 1', content: 'Content for Tab 1' },
        { id: 'tab2', name: 'Tab 2', content: 'Content for Tab 2' },
        { id: 'tab3', name: 'Tab 3', content: 'Content for Tab 3' }
      ]
    }
  }
}
</script>

使用动态组件

通过动态组件 <component :is="currentComponent"> 实现 Tab 内容的切换。

vue实现tab互斥

<template>
  <div>
    <button 
      v-for="tab in tabs" 
      :key="tab.id" 
      @click="activeTab = tab.id"
      :class="{ active: activeTab === tab.id }"
    >
      {{ tab.name }}
    </button>
    <component :is="currentComponent"></component>
  </div>
</template>

<script>
import Tab1 from './Tab1.vue'
import Tab2 from './Tab2.vue'
import Tab3 from './Tab3.vue'

export default {
  data() {
    return {
      activeTab: 'tab1',
      tabs: [
        { id: 'tab1', name: 'Tab 1', component: 'Tab1' },
        { id: 'tab2', name: 'Tab 2', component: 'Tab2' },
        { id: 'tab3', name: 'Tab 3', component: 'Tab3' }
      ]
    }
  },
  computed: {
    currentComponent() {
      const tab = this.tabs.find(tab => tab.id === this.activeTab)
      return tab ? tab.component : null
    }
  },
  components: { Tab1, Tab2, Tab3 }
}
</script>

使用 Vue Router

如果 Tab 切换涉及路由,可以通过 Vue Router 实现。

<template>
  <div>
    <router-link 
      v-for="tab in tabs" 
      :key="tab.path" 
      :to="tab.path"
      active-class="active"
    >
      {{ tab.name }}
    </router-link>
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tabs: [
        { path: '/tab1', name: 'Tab 1' },
        { path: '/tab2', name: 'Tab 2' },
        { path: '/tab3', name: 'Tab 3' }
      ]
    }
  }
}
</script>

使用第三方库

可以使用第三方库如 vue-tabselement-ui 的 Tab 组件快速实现互斥 Tab。

<template>
  <el-tabs v-model="activeTab">
    <el-tab-pane label="Tab 1" name="tab1">Content for Tab 1</el-tab-pane>
    <el-tab-pane label="Tab 2" name="tab2">Content for Tab 2</el-tab-pane>
    <el-tab-pane label="Tab 3" name="tab3">Content for Tab 3</el-tab-pane>
  </el-tabs>
</template>

<script>
export default {
  data() {
    return {
      activeTab: 'tab1'
    }
  }
}
</script>

注意事项

  • 确保 activeTab 的初始值与某个 Tab 的 idname 匹配。
  • 如果需要动态添加或删除 Tab,确保 tabs 数组的更新能够触发视图的重新渲染。
  • 使用动态组件时,确保组件已正确注册。

标签: 互斥vue
分享给朋友:

相关文章

vue实现发表

vue实现发表

Vue 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双向…

vue实现图集

vue实现图集

Vue 实现图集的方法 在 Vue 中实现图集功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用第三方库(如 vue-image-lightbox) 安装 vue-image-lig…

vue实现翻译

vue实现翻译

Vue 实现翻译功能的方法 使用 i18n 插件实现多语言切换 安装 vue-i18n 插件: npm install vue-i18n 创建语言资源文件(如 en.json 和 zh.json)…

vue实现海报

vue实现海报

Vue 实现海报生成方案 使用 html2canvas 库 html2canvas 是一个将 HTML 元素转换为 Canvas 的库,适合将 Vue 组件渲染为海报图片 安装依赖: npm…

vue 实现遮罩

vue 实现遮罩

Vue 实现遮罩层的方法 使用固定定位和透明背景 在Vue中实现遮罩层可以通过CSS固定定位结合透明背景色完成。创建一个全屏遮罩组件,利用position: fixed覆盖整个视窗。 <te…

vue实现验证

vue实现验证

Vue 表单验证实现方法 在Vue中实现表单验证可以通过多种方式完成,以下是常见的几种方法: 使用Vuelidate库 Vuelidate是一个轻量级的Vue表单验证库,安装后可以通过简单的配置实现…