当前位置:首页 > 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实现多个tab

vue实现多个tab

Vue 实现多个 Tab 的方法 使用动态组件切换 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现多个…

vue实现一个系统

vue实现一个系统

Vue 系统实现步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目: npm init vue@latest my-system 选择需要的配置(Router、Pinia 等)。…

vue实现语音

vue实现语音

Vue 实现语音功能的方法 使用 Web Speech API Vue 可以结合 Web Speech API 实现语音识别和合成功能。Web Speech API 包含 SpeechRecognit…

vue 路由 实现

vue 路由 实现

Vue 路由实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue 路由的详细步骤: 安装 Vue Router 通过 npm 或 ya…

vue评分实现

vue评分实现

Vue 评分组件实现方法 使用第三方库(如 Element UI) 安装 Element UI: npm install element-ui 引入并注册组件: import Vue from…

实现简易vue

实现简易vue

实现简易 Vue 的核心思路 Vue 的核心功能包括数据响应式、模板编译和虚拟 DOM。以下是一个简易实现方案,涵盖核心功能模块。 数据响应式系统 通过 Object.defineProperty…