当前位置:首页 > VUE

vue实现一个tab栏

2026-01-07 06:48:02VUE

vue实现一个tab栏

Vue 实现 Tab 栏

基础实现(选项式 API)

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

<script>
export default {
  data() {
    return {
      activeTab: 0,
      tabs: [
        { title: 'Tab 1', content: 'Content for Tab 1' },
        { title: 'Tab 2', content: 'Content for Tab 2' },
        { title: 'Tab 3', content: 'Content for Tab 3' }
      ]
    }
  }
}
</script>

<style>
.tab-header {
  display: flex;
  gap: 10px;
  margin-bottom: 10px;
}

.tab-header button {
  padding: 8px 16px;
  background: none;
  border: 1px solid #ddd;
  cursor: pointer;
}

.tab-header button.active {
  background: #007bff;
  color: white;
  border-color: #007bff;
}

.tab-content {
  border: 1px solid #ddd;
  padding: 20px;
}
</style>

组合式 API 实现

<template>
  <div class="tab-container">
    <div class="tab-header">
      <button 
        v-for="(tab, index) in tabs" 
        :key="index"
        @click="activeTab = index"
        :class="{ 'active': activeTab === index }"
      >
        {{ tab.title }}
      </button>
    </div>
    <div class="tab-content">
      <component :is="tabs[activeTab].component" />
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import Tab1Content from './Tab1Content.vue'
import Tab2Content from './Tab2Content.vue'

const activeTab = ref(0)
const tabs = [
  { title: 'Tab 1', component: Tab1Content },
  { title: 'Tab 2', component: Tab2Content }
]
</script>

动态组件实现

<template>
  <div class="tab-container">
    <div class="tab-header">
      <button 
        v-for="(tab, index) in tabs" 
        :key="index"
        @click="activeTab = tab.component"
        :class="{ 'active': activeTab === tab.component }"
      >
        {{ tab.title }}
      </button>
    </div>
    <div class="tab-content">
      <keep-alive>
        <component :is="activeTab" />
      </keep-alive>
    </div>
  </div>
</template>

<script setup>
import { ref, shallowRef } from 'vue'
import Tab1Content from './Tab1Content.vue'
import Tab2Content from './Tab2Content.vue'

const activeTab = shallowRef(Tab1Content)
const tabs = [
  { title: 'Tab 1', component: Tab1Content },
  { title: 'Tab 2', component: Tab2Content }
]
</script>

路由集成实现

<template>
  <div class="tab-container">
    <router-link 
      v-for="(tab, index) in tabs" 
      :key="index"
      :to="tab.path"
      custom
      v-slot="{ navigate, isActive }"
    >
      <button 
        @click="navigate"
        :class="{ 'active': isActive }"
      >
        {{ tab.title }}
      </button>
    </router-link>
    <div class="tab-content">
      <router-view />
    </div>
  </div>
</template>

<script setup>
const tabs = [
  { title: 'Tab 1', path: '/tab1' },
  { title: 'Tab 2', path: '/tab2' }
]
</script>

注意事项

  • 使用 shallowRef 替代 ref 可以避免不必要的组件重新渲染
  • keep-alive 可以缓存组件状态,避免切换时重复渲染
  • 路由集成时注意配置对应的路由规则
  • 样式可以根据需求自定义,示例仅提供基础样式

标签: vuetab
分享给朋友:

相关文章

vue实现选中单元格

vue实现选中单元格

Vue 实现选中单元格的方法 基础实现思路 在 Vue 中实现选中单元格功能,通常可以通过动态绑定 class 或 style 来实现。以下是一个基于表格的简单实现示例: <templ…

vue实现打印二维码

vue实现打印二维码

安装二维码生成库 使用 qrcode 或 vue-qrcode 库生成二维码。通过 npm 安装: npm install qrcode vue-qrcode 生成二维码 在 Vue 组件中引入…

vue实现新闻

vue实现新闻

Vue 实现新闻功能 使用 Vue 实现新闻功能通常涉及新闻列表展示、新闻详情页、分类筛选等模块。以下是实现的基本思路和代码示例。 新闻列表展示 通过 Vue 组件展示新闻列表,通常使用 v-for…

vue筛选实现

vue筛选实现

Vue 筛选实现方法 使用计算属性实现筛选 计算属性是 Vue 中实现数据筛选的常用方式。通过定义一个计算属性,可以根据输入的条件动态过滤数据。 <template> <div…

vue 全景实现

vue 全景实现

Vue 全景实现方案 在Vue中实现全景效果,通常需要结合WebGL或第三方库来处理3D场景渲染。以下是几种常见方法: 使用Three.js库 Three.js是一个强大的WebGL库,适合创建3D…

vue实现导出

vue实现导出

Vue 实现导出功能的方法 在 Vue 项目中实现导出功能通常涉及将数据导出为 Excel、CSV 或其他格式。以下是几种常见的实现方式: 使用 xlsx 库导出 Excel 安装 xlsx 库:…