el-card结合el-tabs实现带标签页的卡片

效果

使用方式

跟官网的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>

这样就可以了,剩下就是修改修改样式

相关推荐
10年前端老司机15 分钟前
Promise 常见面试题(持续更新中)
前端·javascript
潘小安29 分钟前
跟着 AI 学 (一)- shell 脚本
前端·ci/cd·vibecoding
clownAdam1 小时前
Chrome性能优化秘籍
前端·chrome·性能优化
@Kerry~1 小时前
phpstudy .htaccess 文件内容
java·开发语言·前端
nueroamazing2 小时前
PPT-EA:PPT自动生成器
vue.js·python·语言模型·flask·大模型·项目·ppt
@PHARAOH3 小时前
WHAT - 前端性能指标(交互和响应性能指标)
前端·交互
噢,我明白了3 小时前
前端js 常见算法面试题目详解
前端·javascript·算法
im_AMBER3 小时前
Web 开发 30
前端·笔记·后端·学习·web
Jonathan Star3 小时前
Webpack 打包优化与骨架屏结合:双管齐下提升前端性能与用户体验
前端·webpack·ux
做好一个小前端3 小时前
后端接口获取到csv格式内容并导出,拒绝乱码
前端·javascript·html