当前位置:首页 > VUE

vue实现一个tab栏

2026-03-06 21:33:42VUE

实现基础Tab栏结构

使用Vue的v-for指令动态生成tab标题,结合v-showv-if控制内容显示:

<template>
  <div class="tab-container">
    <div class="tab-header">
      <div 
        v-for="(tab, index) in tabs" 
        :key="index"
        @click="activeTab = index"
        :class="{ 'active': activeTab === index }"
      >
        {{ tab.title }}
      </div>
    </div>
    <div class="tab-content">
      <div v-for="(tab, index) in tabs" :key="index" v-show="activeTab === index">
        {{ tab.content }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      activeTab: 0,
      tabs: [
        { title: 'Tab 1', content: 'Content 1' },
        { title: 'Tab 2', content: 'Content 2' },
        { title: 'Tab 3', content: 'Content 3' }
      ]
    }
  }
}
</script>

<style scoped>
.tab-header {
  display: flex;
  border-bottom: 1px solid #ddd;
}
.tab-header div {
  padding: 10px 20px;
  cursor: pointer;
}
.tab-header div.active {
  border-bottom: 2px solid #42b983;
  color: #42b983;
}
.tab-content {
  padding: 20px;
}
</style>

使用组件化方式

将Tab栏拆分为可复用的组件结构:

vue实现一个tab栏

<!-- TabContainer.vue -->
<template>
  <div class="tab-container">
    <div class="tab-header">
      <slot name="header"></slot>
    </div>
    <div class="tab-content">
      <slot name="content"></slot>
    </div>
  </div>
</template>

<!-- TabItem.vue -->
<template>
  <div v-show="isActive">
    <slot></slot>
  </div>
</template>

<script>
export default {
  props: {
    title: String,
    isActive: Boolean
  }
}
</script>

<!-- 使用示例 -->
<template>
  <TabContainer>
    <template v-slot:header>
      <div 
        v-for="(tab, index) in tabs"
        :key="index"
        @click="activateTab(index)"
        :class="{ 'active': activeTab === index }"
      >
        {{ tab.title }}
      </div>
    </template>
    <template v-slot:content>
      <TabItem 
        v-for="(tab, index) in tabs"
        :key="index"
        :isActive="activeTab === index"
      >
        {{ tab.content }}
      </TabItem>
    </template>
  </TabContainer>
</template>

添加动画效果

为tab内容切换添加过渡动画:

<template>
  <transition name="fade" mode="out-in">
    <div v-for="(tab, index) in tabs" :key="index" v-show="activeTab === index">
      {{ tab.content }}
    </div>
  </transition>
</template>

<style scoped>
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.3s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

响应式Tab栏

根据屏幕宽度自动调整Tab显示方式:

vue实现一个tab栏

@media (max-width: 768px) {
  .tab-header {
    flex-direction: column;
  }
  .tab-header div {
    border-bottom: 1px solid #eee;
  }
}

动态添加/删除Tab

实现动态管理Tab的功能:

methods: {
  addTab() {
    this.tabs.push({
      title: `Tab ${this.tabs.length + 1}`,
      content: `New Content ${this.tabs.length + 1}`
    })
  },
  removeTab(index) {
    if (this.tabs.length <= 1) return
    this.tabs.splice(index, 1)
    if (this.activeTab >= index) {
      this.activeTab = Math.max(0, this.activeTab - 1)
    }
  }
}

使用第三方库

如需更复杂功能,可考虑使用现成组件库:

npm install vue-tabs-component
import { Tabs, Tab } from 'vue-tabs-component'

export default {
  components: {
    Tabs, Tab
  }
}
<tabs>
  <tab name="First tab" :selected="true">
    First tab content
  </tab>
  <tab name="Second tab">
    Second tab content
  </tab>
</tabs>

标签: vuetab
分享给朋友:

相关文章

vue为啥能实现监听

vue为啥能实现监听

Vue 实现监听的原理 Vue 的监听能力主要基于其响应式系统,该系统通过数据劫持和依赖收集实现。当数据变化时,系统能自动触发视图更新或执行回调函数。 核心机制:Object.definePrope…

vue设计与实现下载

vue设计与实现下载

vue设计与实现电子书下载 《Vue.js设计与实现》是一本深入解析Vue.js框架原理的书籍,由霍春阳(HcySunYang)撰写。以下是获取该资源的常见途径: 正版购买渠道 京东、…

vue 指令实现

vue 指令实现

Vue 指令实现 Vue 指令是 Vue.js 提供的特殊属性,用于在 DOM 元素上添加特殊行为。指令以 v- 前缀开头,例如 v-model、v-if、v-for 等。以下是实现自定义指令和常用内…

vue翻页实现

vue翻页实现

Vue翻页实现方法 基础分页组件实现 使用v-for和计算属性实现基础分页逻辑: <template> <div> <ul> <li…

vue实现监听

vue实现监听

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

vue实现flbook

vue实现flbook

Vue 实现类似 Flbook 的翻页效果 要实现类似 Flbook 的翻页效果,可以使用 Vue 结合 CSS 动画和 JavaScript 事件处理。以下是实现方法: 安装依赖 需要安装 vue…