当前位置:首页 > 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

vue实现一个tab栏

<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>

进阶功能

添加动画效果

vue实现一个tab栏

<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 管理状态
  • 可扩展支持图标、禁用状态等更多功能

标签: vuetab
分享给朋友:

相关文章

vue实现影院

vue实现影院

Vue实现影院功能的基本思路 使用Vue框架开发影院功能需要结合前端组件化开发、状态管理以及后端API交互。以下是关键实现步骤: 影院页面布局设计 影院页面通常分为顶部导航栏、影院列表区域和底部导航…

mui实现vue

mui实现vue

mui 实现 Vue 的步骤 mui 是一个轻量级的前端框架,常用于移动端开发。结合 Vue 可以实现高效的开发体验。以下是具体实现方法。 安装 mui 和 Vue 通过 npm 或 yarn 安装…

vue实现理财超市

vue实现理财超市

Vue实现理财超市功能 理财超市通常包含产品展示、筛选、排序、详情页等功能,以下是基于Vue的实现方案: 技术栈建议 Vue 2/3 + Vue Router UI库:Element UI/Ant…

vue实现悬浮字体

vue实现悬浮字体

实现悬浮字体的方法 在Vue中实现悬浮字体效果,可以通过CSS的position: fixed或position: sticky属性结合Vue的响应式特性来完成。以下是几种常见的实现方式: 使用CS…

vue 实现登录退出

vue 实现登录退出

Vue 实现登录与退出功能 登录功能实现 创建登录表单组件,包含用户名和密码输入框及提交按钮。使用 v-model 双向绑定数据。 <template> <form @subm…

vue实现动态隐藏

vue实现动态隐藏

动态隐藏的实现方法 在Vue中实现动态隐藏可以通过多种方式,常见的有条件渲染、动态绑定样式或类名。以下是几种具体实现方法: 使用v-if或v-show指令 <template> &…