效果

使用方式
跟官网的el-tabs一样,只需要传入v-model和slots,就会自动生成导航
ini
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="User" name="first">User</el-tab-pane>
<el-tab-pane label="Config" name="second">Config</el-tab-pane>
<el-tab-pane label="Role" name="third">Role</el-tab-pane>
<el-tab-pane label="Task" name="fourth">Task</el-tab-pane>
</el-tabs>
只不过我们这里的my-card-tab是自定义的一个组件,其它功能和el-tabs一样,不过只实现了基础用法,什么删减标签页就没有做了,card组件是封装后的el-card

实现过程
my-card-tab组件可以放很多,但是在card组件里要如何知道放入了多少组件?从而生成导航呢?
看element-plus的源码似乎是用依赖注入来实现的,但是我看不懂源码,就尝试用依赖注入试试看
首先是my-card-tab组件,使用父组件注入的setTab,将当前组件的name传进去,这个name就是我们控制标签页切换的那个name
my-card-tab.vue
<template>
<div class="card-tab" v-show="currentValue === name">
<slot></slot>
</div>
</template>
<script lang="ts" setup>
import { inject } from 'vue'
const props = defineProps({
name: String
})
const tabsRoot: any = inject('tabsRoot')
const { setTab, currentValue } = tabsRoot
setTab(props.name)
</script>
然后在card组件中,取出,放在数组中,然后页面上遍历
kotlin
provide('tabsRoot', {
currentValue,
setTab
})
const nav: Ref<Array<string>> = ref([])
const setTab = (val: any) => {
if (nav.value.includes(val)) return
nav.value.push(val)
}
ini
<div
v-for="(item, index) in nav"
:class="[
'card-header-nav',
modelValue === (item as any) ? 'active' : ''
]"
:key="index"
>
<span @click="clickNav(item as any)">{{ item as any }}</span>
</div>
这样就可以了,剩下就是修改修改样式