当前位置:首页 > VUE

vue组件实现tab

2026-02-19 10:05:31VUE

Vue 组件实现 Tab 切换功能

基础实现方案

创建两个组件:Tabs.vue(父组件)和 Tab.vue(子组件)。父组件管理当前激活的 tab,子组件作为单个 tab 的内容容器。

Tabs.vue

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

<script>
export default {
  data() {
    return {
      tabs: [],
      currentTab: 0
    }
  },
  mounted() {
    this.tabs = this.$children.map(child => ({
      title: child.title
    }))
  }
}
</script>

<style>
.tabs-header button.active {
  background: #ddd;
}
</style>

Tab.vue

vue组件实现tab

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

<script>
export default {
  props: {
    title: {
      type: String,
      required: true
    }
  },
  computed: {
    isActive() {
      return this.$parent.currentTab === this.$parent.tabs.findIndex(tab => tab.title === this.title)
    }
  }
}
</script>

使用示例

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

进阶优化方案

使用 provide/inject 代替直接访问 $parent,使组件更解耦:

Tabs.vue

vue组件实现tab

<script>
export default {
  provide() {
    return {
      tabsProvider: this
    }
  },
  // 其余代码不变
}
</script>

Tab.vue

<script>
export default {
  inject: ['tabsProvider'],
  computed: {
    isActive() {
      return this.tabsProvider.currentTab === this.tabsProvider.tabs.findIndex(tab => tab.title === this.title)
    }
  }
}
</script>

动画效果实现

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

<template>
  <transition name="fade" mode="out-in">
    <div v-show="isActive" :key="title">
      <slot></slot>
    </div>
  </transition>
</template>

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

响应式设计

添加响应式样式,使 tabs 在移动设备上表现良好:

.tabs-header {
  display: flex;
  overflow-x: auto;
}

.tabs-header button {
  white-space: nowrap;
  padding: 10px 20px;
  border: none;
  background: none;
  cursor: pointer;
}

@media (max-width: 768px) {
  .tabs-header {
    flex-wrap: wrap;
  }
  .tabs-header button {
    flex: 1 0 auto;
  }
}

标签: 组件vue
分享给朋友:

相关文章

前端多线程实现vue

前端多线程实现vue

前端多线程与Vue的结合 在Vue中实现多线程通常通过Web Worker技术完成。Web Worker允许在后台线程中运行脚本,避免阻塞主线程,适合处理计算密集型任务。 使用Web Worker的…

vue怎么实现组件缓存

vue怎么实现组件缓存

Vue 实现组件缓存的方法 Vue 提供了内置组件 <keep-alive> 来实现组件缓存,避免重复渲染和销毁组件,提升性能。 基本用法 使用 <keep-alive> 包…

vue实现走势图

vue实现走势图

Vue 实现走势图的方法 使用 ECharts 库 ECharts 是一个强大的数据可视化库,支持多种图表类型,包括走势图(折线图)。在 Vue 项目中可以通过 vue-echarts 封装库或直接使…

vue实现贴图

vue实现贴图

Vue 实现贴图功能 在Vue中实现贴图功能通常涉及将图片动态添加到指定位置或元素上。以下是几种常见实现方式: 使用v-bind动态绑定图片 通过数据驱动的方式动态更换图片源: <templ…

实现 vue 框架

实现 vue 框架

Vue 框架的基本实现 Vue 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现 Vue 框架的基本步骤和核心概念。 核心概念 响应式数据绑定 Vue 的核心特性之一是响应式…

实现vue框架

实现vue框架

Vue框架的基本实现 Vue是一个渐进式JavaScript框架,用于构建用户界面。以下是实现Vue框架的基本步骤: 安装Vue 通过CDN引入Vue是最简单的方式: <script s…