vue实现页面tab
实现 Tab 切换的基本方法
在 Vue 中实现 Tab 切换可以通过动态组件或条件渲染(v-if/v-show)完成。以下是两种常见方式:
动态组件方式
使用 <component :is="currentTab"> 动态加载组件,适合内容复杂的场景:
<template>
<div>
<button @click="currentTab = 'Tab1'">Tab 1</button>
<button @click="currentTab = 'Tab2'">Tab 2</button>
<component :is="currentTab" />
</div>
</template>
<script>
import Tab1 from './Tab1.vue';
import Tab2 from './Tab2.vue';
export default {
components: { Tab1, Tab2 },
data() {
return { currentTab: 'Tab1' };
}
};
</script>
条件渲染方式
适合简单内容,通过 v-show 控制显示(避免频繁销毁组件):
<template>
<div>
<button @click="activeTab = 'tab1'">Tab 1</button>
<button @click="activeTab = 'tab2'">Tab 2</button>
<div v-show="activeTab === 'tab1'">Content 1</div>
<div v-show="activeTab === 'tab2'">Content 2</div>
</div>
</template>
<script>
export default {
data() {
return { activeTab: 'tab1' };
}
};
</script>
添加样式和交互增强
通过 CSS 和状态管理提升用户体验:

<template>
<div class="tab-container">
<div class="tab-buttons">
<button
v-for="tab in tabs"
:key="tab.id"
@click="activeTab = tab.id"
:class="{ 'active': activeTab === tab.id }"
>
{{ tab.label }}
</button>
</div>
<div class="tab-content">
<slot :name="activeTab"></slot>
</div>
</div>
</template>
<script>
export default {
props: {
tabs: Array, // 格式: [{ id: 'tab1', label: 'Tab 1' }]
initialTab: String
},
data() {
return { activeTab: this.initialTab || this.tabs[0]?.id };
}
};
</script>
<style>
.tab-buttons button {
padding: 8px 16px;
background: #eee;
border: none;
cursor: pointer;
}
.tab-buttons button.active {
background: #ddd;
font-weight: bold;
}
</style>
使用第三方库
对于复杂需求,可考虑现成解决方案:
-
Element UI 的
el-tabs组件:
<el-tabs v-model="activeTab"> <el-tab-pane label="Tab 1" name="tab1">Content 1</el-tab-pane> <el-tab-pane label="Tab 2" name="tab2">Content 2</el-tab-pane> </el-tabs> -
Vuetify 的
v-tabs组件:<v-tabs v-model="activeTab"> <v-tab value="tab1">Tab 1</v-tab> <v-tab value="tab2">Tab 2</v-tab> </v-tabs>
进阶功能实现
路由集成
将 Tab 状态与 Vue Router 同步:
// 路由配置
{
path: '/tabs/:tabId',
component: TabsContainer
}
// 组件内
watch: {
'$route.params.tabId'(newVal) {
this.activeTab = newVal;
},
activeTab(newVal) {
this.$router.push(`/tabs/${newVal}`);
}
}
动画过渡
为 Tab 内容添加切换动画:
<transition name="fade" mode="out-in">
<div :key="activeTab">
<!-- 内容 -->
</div>
</transition>
<style>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.3s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
</style>






