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>

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

相关推荐
EndingCoder1 分钟前
搜索算法在前端的实践
前端·算法·性能优化·状态模式·搜索算法
sunbyte6 分钟前
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DoubleVerticalSlider(双垂直滑块)
前端·javascript·css·vue.js·vue
Favor_Yang11 分钟前
SQL Server通过存储过程实现HTML页面生成
前端·信息可视化·sqlserver·存储过程
中微子1 小时前
JavaScript事件循环机制:面试官最爱问的10个问题详解
前端
Eighteen Z1 小时前
CSS揭秘:10.平行四边形
前端·css·css3
拾光拾趣录1 小时前
虚拟DOM
前端·vue.js·dom
爱学习的茄子1 小时前
JavaScript事件循环深度解析:理解异步执行的本质
前端·javascript·面试
1024小神1 小时前
cocos游戏开发中多角色碰撞,物理反弹后改变方向的实现逻辑
前端·javascript
摆烂为不摆烂1 小时前
😁深入JS(五): 一文让你完全理解 hash 与 history 路由,手写前端路由
前端
1024小神1 小时前
cocos游戏开发中,如何制作一个空气墙
前端·javascript