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

vue实现一个tab栏

标签: vuetab
分享给朋友:

相关文章

vue状态管理怎么实现

vue状态管理怎么实现

Vue 状态管理实现方法 使用 Vuex(官方推荐) Vuex 是 Vue 的官方状态管理库,适合中大型应用。 安装 Vuex: npm install vuex --save 创建 Store…

vue实现用户信息表

vue实现用户信息表

Vue 实现用户信息表的方法 使用 Vue CLI 创建项目 安装 Vue CLI 并初始化项目: npm install -g @vue/cli vue create user-info-tabl…

vue实现点击旋转轮盘

vue实现点击旋转轮盘

实现点击旋转轮盘效果 在Vue中实现点击旋转轮盘效果,可以通过CSS动画和Vue的数据绑定结合完成。以下是一个完整的实现方案: 准备工作 需要安装Vue.js环境,可以通过CDN引入或使用Vue C…

vue中实现显示和隐藏

vue中实现显示和隐藏

控制显示与隐藏的方法 在Vue中实现元素的显示和隐藏可以通过多种方式完成,以下是常见的几种方法: 1. 使用v-if指令v-if根据条件动态添加或移除DOM元素,适合需要频繁切换的场景。当条件为f…

vue实现选中单元格

vue实现选中单元格

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

vue调用接口实现退出

vue调用接口实现退出

实现Vue退出功能的步骤 在Vue中调用接口实现退出功能通常需要与后端API交互,以下是实现方法: 前端实现 创建退出方法,调用后端API接口: methods: { logout()…