当前位置:首页 > VUE

vue实现一个tab栏

2026-01-12 08:34:30VUE

Vue 实现 Tab 栏

基础实现

创建 TabsTab 组件,通过 v-model 控制当前激活的标签页。

Tabs.vue

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

<script>
export default {
  props: {
    modelValue: {
      type: Number,
      default: 0
    }
  },
  data() {
    return {
      tabs: []
    }
  },
  methods: {
    selectTab(index) {
      this.$emit('update:modelValue', index)
    }
  }
}
</script>

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

Tab.vue

<template>
  <div v-show="isActive">
    <slot></slot>
  </div>
</template>

<script>
export default {
  props: {
    title: {
      type: String,
      required: true
    }
  },
  data() {
    return {
      isActive: false
    }
  },
  mounted() {
    this.$parent.tabs.push({
      title: this.title
    })
    if (this.$parent.modelValue === this.$parent.tabs.length - 1) {
      this.isActive = true
    }
  }
}
</script>

使用示例

<template>
  <Tabs v-model="activeTab">
    <Tab title="Tab 1">
      Content for Tab 1
    </Tab>
    <Tab title="Tab 2">
      Content for Tab 2
    </Tab>
    <Tab title="Tab 3">
      Content for Tab 3
    </Tab>
  </Tabs>
</template>

<script>
import Tabs from './Tabs.vue'
import Tab from './Tab.vue'

export default {
  components: { Tabs, Tab },
  data() {
    return {
      activeTab: 0
    }
  }
}
</script>

进阶功能

添加动画效果

<transition name="fade" mode="out-in">
  <div v-show="isActive" class="tab-content">
    <slot></slot>
  </div>
</transition>

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

支持动态添加/删除标签页

// 在 Tabs.vue 中添加
watch: {
  modelValue(newVal) {
    this.tabs.forEach((tab, index) => {
      this.$children[index].isActive = index === newVal
    })
  }
}

响应式设计

@media (max-width: 768px) {
  .tabs-header {
    flex-direction: column;
  }
  .tab-header {
    width: 100%;
  }
}

注意事项

  • 确保 Tab 组件始终是 Tabs 的直接子组件
  • 动态添加/删除标签页时需要手动更新 tabs 数组
  • 对于复杂场景,可以考虑使用 Vuex 或 provide/inject 管理状态
  • 可扩展支持图标、禁用状态等更多功能

vue实现一个tab栏

标签: vuetab
分享给朋友:

相关文章

vue实现图片搜索

vue实现图片搜索

Vue实现图片搜索功能 使用HTML5的File API获取图片 通过<input type="file">元素让用户选择图片文件,使用FileReader对象读取图片数据。 <…

vue实现放大效果

vue实现放大效果

使用 CSS transform 实现放大效果 在 Vue 中实现放大效果可以通过 CSS 的 transform: scale() 属性。这种方法简单高效,适合大多数交互场景。 定义一个 CSS…

vue实现tab换行

vue实现tab换行

Vue实现Tab切换的常见方法 使用Vue实现Tab切换功能可以通过多种方式完成,以下是几种常见的方法: 动态组件结合v-if或v-show 通过v-if或v-show控制不同Tab内容的显示与隐…

vue前端实现搜索

vue前端实现搜索

实现搜索功能的基本方法 在Vue中实现搜索功能通常涉及以下几个关键步骤,结合数据绑定、计算属性和方法调用来动态过滤和显示结果。 数据绑定与输入处理 使用v-model双向绑定搜索输入框的值,监听用户…

vue为啥能实现监听

vue为啥能实现监听

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

vue实现选择本地文件

vue实现选择本地文件

实现文件选择功能 在Vue中实现本地文件选择可以通过HTML原生的<input type="file">元素实现。创建一个基本的文件选择组件: <template> &…