vue3 封装简单的 tabs 切换组件
背景:公司项目要求全部换成 vue3 ,而且也没有应用像 element-ui 一类的UI组件,用到的公共组件都是根据项目需求封装的,下面是使用vue3实现简单的tabs组件,我只是把代码分享出来,实现思路如果有需要等我项目不忙了在更,希望大家多提些建议,共同学习共同进步。
tab-group.vue
<template>
<div class="tab-group">
<!-- tabRef 这块本来是用来实现下划线动态切换特效的,暂时没有写效果 -->
<div ref="barRef" class="tab-bar" :style="{ width: widthRef + 'px' }"></div>
<div ref="titsRef" class="tab-header" layout="row" layout-wrap>
<div
ref="titRef"
:class="[{ active: activeKey == item.props.actKey }, 'tab-nav']"
v-for="(item, index) in tabTitLists"
:key="item"
@click="onTabClick($event, item, index)"
>
{{ item.props.label }}
</div>
</div>
<div class="tab-panel">
<slot></slot>
</div>
</div>
</template>
<script>
import { ref, onMounted, provide } from "vue";
export default {
props: {
defaultKey: {
type: String,
default: "1",
},
},
setup(props, context) {
const tabTitLists = context.slots.default();
let activeKey = ref(props.defaultKey); //当前key
provide("activeKey", activeKey);
const barRef = ref(null);
const titRef = ref(null);
let widthRef = ref();
onMounted(() => {
// 设置状态线初始化宽度
widthRef.value = titRef.value.clientWidth;
});
function onTabClick(event, tab, index) {
activeKey.value = tab.props.actKey;
}
return {
tabTitLists,
barRef,
titRef,
widthRef,
onTabClick,
activeKey,
};
},
};
</script>
<style scoped lang="less">
.tab-group {
// .tab-bar {
// position: absolute;
// left: 0;
// border-bottom: 2px solid #409eff;
// }
.tab-header {
&:after {
content: "";
width: 100%;
border-bottom: 2px solid #ddd;
}
}
.tab-nav {
color: #5c5c5c;
font-size: 14px;
line-height: 40px;
display: inline-block;
margin-right: 3em;
cursor: pointer;
border-bottom: 2px solid transparent;
&.active {
color: #2f5cd5;
border-bottom-color: #2f5cd5;
}
}
.tab-panel{
padding: 15px;
}
}
</style>
tab-panel.vue
<template>
<div v-show="actKey == activeKey">
<slot></slot>
</div>
</template>
<script>
import { ref, inject } from "vue";
export default {
props: {
actKey: {
type: String,
default: "1",
},
label: {
type: String,
default: "全部",
},
},
setup() {
let activeKey = ref();
activeKey = inject("activeKey");
return { activeKey };
},
};
</script>
应用
<template>
<div>
<tab-group defaultKey="1">
<tab-panel label="进行中" actKey="1">进行中-内容</tab-panel>
<tab-panel label="已结束" actKey="2">已结束-内容</tab-panel>
<tab-panel label="全部" actKey="3">全部带-内容</tab-panel>
</tab-group>
</div>
</template>
<script>
import tabGroup from "../common/tabs/tab-group.vue";
import tabPanel from "../common/tabs/tab-panel.vue";
export default {
components: {
tabPanel,
tabGroup,
},
setup(props, context) {
return {};
},
};
</script>
vue3 封装简单的 tabs 切换组件的更多相关文章
- 简单的Tab切换组件
由于代码都有注释,所以不多加解释,大家都知道的.直接贴代码: 代码如下: /** * 简单的Tab切换 * 支持可配置项 如下参数 */ function Tab(){ this.config = { ...
- react实现的tab切换组件
我有点想要吐槽,因为用原生的js实现起来挺简单的一个小东西,改用react来写却花了我不少时间,也许react的写法只有在复杂的web应用中才能体现出它的优势吧!不过吐槽归吐槽,对react这种优雅的 ...
- 【摸鱼神器】一次搞定 vue3的 路由 + 菜单 + tabs
做一个管理后台,首先要设置路由,然后配置菜单(有时候还需要导航),再来一个动态tabs,最后加上权限判断. 这个是不是有点繁琐?尤其是路由的设置和菜单的配置,是不是很雷同?那么能不能简单一点呢?如果可 ...
- Vue简单基础 + 实例 及 组件通信
vue的双向绑定原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...
- Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件
封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...
- 手把手从零开始---封装一个vue视频播放器组件
现在,在网页上播放视频已经越来越流行,但是网上的资料鱼龙混杂,很难找到自己想要的,今天小编就自己的亲身开发体验,手把手从零开始---封装一个vue视频播放器组件. 作为一个老道的前端搬砖师,怎么可能会 ...
- Android零基础入门第54节:视图切换组件ViewSwitcher
原文:Android零基础入门第54节:视图切换组件ViewSwitcher 前面三期学习了ProgressBar系列组件,那本期开始一起来学习ViewAnimator组件. 一.ViewAnimat ...
- 深入理解NIO(一)—— NIO的简单使用及其三大组件介绍
深入理解NIO(一)—— NIO的简单使用及其三大组件介绍 深入理解NIO系列分为四个部分 第一个部分也就是本节为NIO的简单使用(我很少写这种新手教程,所以如果你是复习还好,应该不难理解这篇,但如果 ...
- 二次封装这几个 element-ui 组件后,大大减少了我 CRUD 的时间
element-ui 因其组件丰富.可拓展性强.文档详细等优点成为 Vue 最火的第三方 UI 框架.element-ui 其本身就针对后台系统设计了很多实用的组件,基本上满足了平时的开发需求. 既然 ...
随机推荐
- springboot打包上线
发布到线上的包结构 runtime是发布到线上的目录结构 1.项目pom.xml添加打包配置 <build> <plugins> <plugin> <grou ...
- CVD和ALD薄膜沉积技术应用领域
CVD和ALD薄膜沉积技术应用领域 显示 用于OLED.QD-OLED.甚至未来QLED的薄膜封装,通过有机/无机叠层结构的保护,水汽渗透率WVTR可降至10-5g/m2/day,保证OLED或者量子 ...
- 多级中间表示概述MLIR
多级中间表示概述MLIR MLIR项目是一种构建可重用和可扩展的编译器基础结构的新颖方法.MLIR旨在解决软件碎片,改善异构硬件的编译,显着降低构建特定于域的编译器的成本以及帮助将现有编译器连接在一起 ...
- RabbitMQ由浅入深入门全总结(二)
写在最前面 距离上一次发文章已经很久了,其实这段时间一直也没有停笔,只不过在忙着找工作还有学校结课的事情,重新弄了一下博客,后面也会陆陆续续会把文章最近更新出来~ 这篇文章有点长,就分了两篇 PS:那 ...
- MIT6.828-LAB1 : PC启动
Lab1 1. 先熟悉PC的物理地址空间 这里其实有很多可以说的,不过先简单描述一下吧.从0x00000000到0x00100000这1mb的地址空间时机器处于16位的实模式.也就是说这个时候机器的汇 ...
- Huawei USG6530防火墙
CF卡:(Compact Flash)最初是一种用于便携式电子设备的数据存储设备.作为一种存储设备,它革命性的使用了闪存 与sd卡的区别:SD卡的优点是安全.体积小巧,价格较之CF卡相对比较低,适合用 ...
- 为你的Go应用创建轻量级Docker镜像?
缩小Go二进制文件大小 环境 youmen@youmendeMacBook-Pro % gcc -dumpversion 12.0.5 youmen@youmendeMacBook-Pro % go ...
- 轻松吃透实时时钟芯片DS1302软硬件设计,看完秒懂
今天我们来讨论一款老掉牙的实时时钟芯片DS1302.什么是实时时钟(RealTime Clock, RTC)呢?为什么我们需要它呢?假设你使用单片机实现万年历应用,一般的做法是这样的:设置中断后判断1 ...
- 百炼3752:走迷宫--栈实现dfs
3752:走迷宫 总时间限制: 1000ms 内存限制: 65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最 ...
- 一次 RocketMQ 顺序消费延迟的问题定位
一次 RocketMQ 顺序消费延迟的问题定位 问题背景与现象 昨晚收到了应用报警,发现线上某个业务消费消息延迟了 54s 多(从消息发送到MQ 到被消费的间隔): 2021-06-30T23:12: ...