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 其本身就针对后台系统设计了很多实用的组件,基本上满足了平时的开发需求. 既然 ...
随机推荐
- Processing平台之PVector求角度
问题:在processing 平台,通过给定三个PVector向量,如何求他们之间的夹角,同时确定是在左侧还是右侧? 如图所示,在processing 平台中,PVector表示点的坐标是以原点为起点 ...
- ML Pipelines管道
ML Pipelines管道 In this section, we introduce the concept of ML Pipelines. ML Pipelines provide a uni ...
- YOLOv4全文阅读(全文中文翻译)
YOLOv4全文阅读(全文中文翻译) YOLOv4: Optimal Speed and Accuracy of Object Detection 论文链接: https://arxiv.org/pd ...
- 使用ONNX将模型转移至Caffe2和移动端
使用ONNX将模型转移至Caffe2和移动端 本文介绍如何使用 ONNX 将 PyTorch 中定义的模型转换为 ONNX 格式,然后将其加载到 Caffe2 中.一旦进入 Caffe2, 就可以运行 ...
- 超轻量AI引擎MindSpore Lite
超轻量AI引擎MindSpore Lite 揭秘一下端上的AI引擎:MindSpore Lite. MindSpore Lite是MindSpore全场景AI框架的端侧引擎,目前MindSpore L ...
- RGB-D相机视觉SLAM
RGB-D相机视觉SLAM Dense Visual SLAM for RGB-D Cameras 开源代码地址: vision.in.tum.de/data/software/dvo 摘要 本文提 ...
- Python集合:set
集合 集合的描述 set是一个无序不重复的序列,可以用{}或者 set() 函数创建集合,它存放不可变类型(如字符串.数字.元组)数据. 注意:创建一个空集合必须使用set()方法,因为{}是用来生成 ...
- Redis--狂神说Redis基础汇总(完结)
Redis--狂神说Redis基础汇总(完结) 2021.6.12-2021.6.14:端午学学玩玩弄完了Redis基础的汇总,越学越觉得自己知识量的匮乏. 参考链接:狂神说Java--Redis汇总 ...
- 一篇文章通俗易懂的让你彻底理解 Java 注解
很多Java程序员,对Java的注解一知半解,更有甚者,有的人可能连注解是什么都不知道 本文我们用最简单的 demo , 最通俗最短的语言,带你了解注解到底是什么? 先来简单回顾一下基础,我们知道,J ...
- QueryTable的使用以及错误
1.QuerySeter的filter使用遇到的错误 1.1 Filter里的字段名和操作符要用双下划线."__" 不是" _",否则会被认为成是列名的一部分, ...