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

vue实现一个tab栏

标签: vuetab
分享给朋友:

相关文章

vue实现后退

vue实现后退

Vue 实现后退功能的方法 在 Vue 中实现后退功能通常可以通过以下几种方式完成,具体取决于应用场景和需求。 使用 window.history API 通过原生 JavaScript 的 win…

vue for实现

vue for实现

Vue 中的 v-for 指令 v-for 是 Vue.js 中用于渲染列表数据的核心指令,通过遍历数组或对象生成动态内容。 基本语法(数组) <ul> <li v-for="…

vue分页实现

vue分页实现

实现Vue分页的几种方法 使用Element UI的分页组件 安装Element UI库后,可以直接使用其分页组件。以下是一个基本示例: <template> <div>…

vue弹幕实现

vue弹幕实现

Vue弹幕实现方法 弹幕功能常见于视频直播或评论区,以下是基于Vue的实现方案,涵盖基础弹幕、动画控制及性能优化。 基础弹幕渲染 通过v-for动态渲染弹幕列表,结合CSS实现横向移动效果。…

vue实现屏幕撑满

vue实现屏幕撑满

使用 CSS 设置全屏 在 Vue 中实现屏幕撑满可以通过 CSS 样式来控制。确保根元素和子元素的高度设置为 100%。 <template> <div class="ful…

vue实现添加删除

vue实现添加删除

Vue 实现添加和删除功能 在 Vue 中实现添加和删除功能通常涉及数据绑定、事件处理和列表渲染。以下是具体实现方法: 数据定义 在 Vue 实例或组件的 data 中定义一个数组来存储项目: d…