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 其本身就针对后台系统设计了很多实用的组件,基本上满足了平时的开发需求. 既然 ...
随机推荐
- zk客户端及锁的使用
1.生成zk客户端对象 private CuratorFramework buildClient() { logger.info("zookeeper registry center ini ...
- MindSpore循环神经网络
MindSpore循环神经网络 一. 神经网络的组成 神经元模型:首先简单的了解以下构成神经网络的最基础单元:神经元.每个神经元与其它神经元相连,处于激活状态时,就会向相连的神经元发送相应信号.从而改 ...
- MindSpore算子支持类
MindSpore算子支持类 Q:在使用Conv2D进行卷积定义的时候使用到了group的参数,group的值不是只需要保证可以被输入输出的维度整除即可了吗?group参数的传递方式是怎样的呢? A: ...
- Covid经济型自主汽车
Covid经济型自主汽车 Autonomous Vehicles in Covid Economy Covid经济已经对汽车行业产生了负面影响,更多的变化正在进行中,同时也带来了大量的不确定性.我们可 ...
- eclipse解决中文乱码
参考链接:https://blog.csdn.net/lzc2644481789/article/details/97244261
- postman之内建变量的基础应用
一.Postman有以下内建变量,适合一次性使用:{{$guid}}//生成GUID{{$timestamp}}//当前时间戳{{$randomInt}}//0-1000的随机整数 简单应用举例: 二 ...
- 【NX二次开发】NX内部函数,libugui.dll文件中的内部函数
本文分为两部分:"带参数的函数"和 "带修饰的函数". 浏览这篇博客前请先阅读: [NX二次开发]NX内部函数,查找内部函数的方法 带参数的函数: bool A ...
- VisualStudio自动添加注释
1.VisualStudio 新开页自动添加注释 a 在团队开发或者公司开发中,我们一般都喜欢给自己所创建的类或者接口以及其它模板设置版权说明,但是每个类一个一个的去加又是非常的费劲,所以一般情况下 ...
- csps考前的一些总结(然而可能并没有用)
记录考前的一些复习和总结,如果没有特殊情况不再写新的题解了 图论: 一.最短路: 1.spfa算法中的vis数组记录的是有没有入队,防止多次入队,通过松弛操作来达到最优解 2.dijkstra算法的v ...
- Java-IO流的继承结构
一 IO流的继承结构如下 二 字节流 1.InputStream(字节流读取数据),为抽象类,不可创建对象:其具体实现需要通过子类FileInputStream(读取文件数据).BufferedI ...