当前位置:首页 > VUE

vue实现一个tab栏

2026-01-07 06:48:02VUE

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 可以缓存组件状态,避免切换时重复渲染
  • 路由集成时注意配置对应的路由规则
  • 样式可以根据需求自定义,示例仅提供基础样式

vue实现一个tab栏

标签: vuetab
分享给朋友:

相关文章

订单 vue实现

订单 vue实现

Vue 实现订单功能 数据模型设计 订单功能通常需要设计以下数据结构: // 订单数据结构 const order = { id: '', // 订单ID userId:…

vue实现单词反转

vue实现单词反转

实现思路 在Vue中实现单词反转功能,可以通过多种方式完成。核心思路是利用JavaScript的字符串处理方法,将输入的单词或句子拆分为数组,反转数组后再拼接成字符串。 方法一:使用计算属性 通过计…

vue实现文档分享

vue实现文档分享

Vue 实现文档分享功能 文档分享功能通常涉及文件上传、存储、生成分享链接以及权限控制等模块。以下是基于 Vue 的实现方案: 文件上传组件 使用 element-ui 或 ant-design-v…

vue实现选择分类

vue实现选择分类

Vue 实现选择分类的方法 使用 v-model 绑定选择值 在 Vue 中可以通过 v-model 指令实现双向数据绑定,适用于下拉选择框(<select>)。以下是一个基本示例: &…

vue实现路由导航

vue实现路由导航

路由导航的实现方式 在Vue中,路由导航主要通过Vue Router实现。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。 基本路由配置 安装Vue Router后…

vue实现tab换行

vue实现tab换行

Vue实现Tab切换的常见方法 使用Vue实现Tab切换功能可以通过多种方式完成,以下是几种常见的方法: 动态组件结合v-if或v-show 通过v-if或v-show控制不同Tab内容的显示与隐…