标签一的内容 标签二的内容 标签三的内容 标签四的内容
标签一的内容 标签二的内容 标签三的内容 标签四的内容
活动介绍

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <style> [v-cloak]{ display:none; } .tabs{ font-size:14px; color:#434b59; } .tab-bar:after{ content:""; display: block; width: 100%; height: 1px; background-color:pink; margin-top: -1px; } .tabs-tabs{ display: inline-block; padding:4px 16px; margin-right: 6px; border: 1px solid pink; position: relative; } .tabs-tab-active{ color:#3399ff; border-top:1px solid #3399ff; border-bottom: 1px solid #ffffff; } .tabs-tab-active:before{ content:""; display: block; height: 1px; top: 0; left: 0; right: 0; } .tabs-content{ padding: 8px 0; } </style> </head> <body> <div id="app" v-cloak> <tabs v-model="activeKey"> <pane label="标签一" name="1">标签一的内容</pane> <pane label="标签二" name="2">标签二的内容</pane> <pane label="标签三" name="3">标签三的内容</pane> <pane label="标签四" name="4">标签四的内容</pane> </tabs> </div> <script> var vm=new Vue({ el:"#app", data:{ activeKey:'1' } }) Vue.component('tabs',{ template:` <div class="tabs"> <div class="tabs-bar"> <div class="tabCls(item)" v-for="(item,index)in navList" @click="handleChange(index)"> {{item.label}} </div> </div></div> <div class="tabs-content"> <slot></slot> </div>`, props:{ value:{ type:[String,Number] } }, data:function (){ return{ navList:[], currentValue:this.value }

时间: 2025-06-25 14:17:20 浏览: 12
### Vue 自定义 Tabs 组件实现及样式设计 #### 1. 组件结构 在 Vue 中,`Tabs` 和 `Pane` 是常见的组合组件模式。为了实现这一功能,可以通过父组件 (`Tabs`) 来管理子组件 (`Pane`) 的状态和逻辑[^1]。 以下是基本的组件结构: ```html <template> <div class="tabs"> <!-- Tab 导航 --> <div class="tab-header"> <div v-for="(item, index) in tabsList" :key="index" :class="{ 'active': activeIndex === index }" @click="selectTab(index)" class="tab-item" > {{ item.label }} </div> </div> <!-- Tab 内容区域 --> <div class="tab-content"> <slot></slot> <!-- 动态渲染 Pane 子组件的内容 --> </div> </div> </template> ``` #### 2. 数据绑定与交互逻辑 通过数据绑定来控制当前激活的 Tab 面板。这里使用 `v-model` 或者内部变量 `activeIndex` 来跟踪选中的索引位置[^3]。 ```javascript <script> export default { data() { return { activeIndex: 0, tabsList: [] // 存储所有的 tab 标签项 }; }, methods: { selectTab(index) { this.activeIndex = index; } }, created() { this.tabsList = [ { label: "首页", content: "这是首页内容" }, { label: "设置", content: "这是设置页内容" }, { label: "帮助", content: "这是帮助页面内容" } ]; } }; </script> ``` #### 3. 样式设计 为了让每个标签具有相同的宽度并居中显示,可以采用 CSS Flexbox 布局技术[^2]。 ```css <style scoped> .tabs { width: 100%; } .tab-header { display: flex; justify-content: center; /* 居中 */ border-bottom: 1px solid #ccc; } .tab-item { padding: 10px 20px; cursor: pointer; text-align: center; flex-grow: 1; /* 让每个标签占据相同比例的空间 */ border-top-left-radius: 5px; border-top-right-radius: 5px; } .tab-item:hover { background-color: #f0f0f0; } .tab-item.active { color: white; background-color: blue; } </style> ``` #### 4. 子组件 (Pane) `Pane` 可以作为插槽的一部分动态加载到 `Tabs` 容器中。这样可以根据不同的需求灵活扩展面板数量和内容。 ```html <!-- Parent Component Usage Example --> <Tabs> <Pane name="home">Home Content Here</Pane> <Pane name="settings">Settings Content Here</Pane> <Pane name="help">Help Content Here</Pane> </Tabs> ``` ```javascript // Pane.vue <template> <div v-if="isActive">{{ content }}</div> </template> <script> export default { props: ['name', 'content'], computed: { isActive() { return this.$parent.activeIndex === this.index; } } }; </script> ``` --- ### 总结 上述方法展示了如何构建一个基础的自定义 `Tabs` 组件及其对应的 `Pane` 子组件。它利用了 Vue 的响应式特性以及现代布局工具(如 Flexbox),从而实现了既美观又实用的效果[^3]。
阅读全文

相关推荐