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

vue实现atm

Vue实现ATM机模拟功能 使用Vue.js实现ATM机模拟功能需要结合组件化开发、状态管理以及用户交互逻辑。以下是关键实现步骤: 核心组件结构 创建以下Vue组件构建ATM界面: CardRea…

vue表格重置怎么实现

vue表格重置怎么实现

重置表格数据的方法 在Vue中重置表格数据通常需要操作绑定的数据源,以下是几种常见实现方式: 直接重置数据源 // 假设表格绑定的是tableData this.tableData = [...t…

vue实现drag

vue实现drag

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 来完成。以下是两种常见方法的实现方式。 使用 HTML5 拖拽…

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…

vue实现picker

vue实现picker

Vue 实现 Picker 组件的方法 在 Vue 中实现 Picker 组件可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 HTML 和 CSS 实现 通过 Vue 的模板和样式绑定,…

vue环境实现

vue环境实现

Vue 环境搭建 安装 Node.js 和 npm Node.js 是运行 Vue 的基础环境,npm 是包管理工具。从 Node.js 官网 下载并安装最新稳定版本。安装完成后,在终端运行以下命令验…