背景:公司项目要求全部换成 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 切换组件的更多相关文章

  1. 简单的Tab切换组件

    由于代码都有注释,所以不多加解释,大家都知道的.直接贴代码: 代码如下: /** * 简单的Tab切换 * 支持可配置项 如下参数 */ function Tab(){ this.config = { ...

  2. react实现的tab切换组件

    我有点想要吐槽,因为用原生的js实现起来挺简单的一个小东西,改用react来写却花了我不少时间,也许react的写法只有在复杂的web应用中才能体现出它的优势吧!不过吐槽归吐槽,对react这种优雅的 ...

  3. 【摸鱼神器】一次搞定 vue3的 路由 + 菜单 + tabs

    做一个管理后台,首先要设置路由,然后配置菜单(有时候还需要导航),再来一个动态tabs,最后加上权限判断. 这个是不是有点繁琐?尤其是路由的设置和菜单的配置,是不是很雷同?那么能不能简单一点呢?如果可 ...

  4. Vue简单基础 + 实例 及 组件通信

    vue的双向绑定原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...

  5. Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件

    封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...

  6. 手把手从零开始---封装一个vue视频播放器组件

    现在,在网页上播放视频已经越来越流行,但是网上的资料鱼龙混杂,很难找到自己想要的,今天小编就自己的亲身开发体验,手把手从零开始---封装一个vue视频播放器组件. 作为一个老道的前端搬砖师,怎么可能会 ...

  7. Android零基础入门第54节:视图切换组件ViewSwitcher

    原文:Android零基础入门第54节:视图切换组件ViewSwitcher 前面三期学习了ProgressBar系列组件,那本期开始一起来学习ViewAnimator组件. 一.ViewAnimat ...

  8. 深入理解NIO(一)—— NIO的简单使用及其三大组件介绍

    深入理解NIO(一)—— NIO的简单使用及其三大组件介绍 深入理解NIO系列分为四个部分 第一个部分也就是本节为NIO的简单使用(我很少写这种新手教程,所以如果你是复习还好,应该不难理解这篇,但如果 ...

  9. 二次封装这几个 element-ui 组件后,大大减少了我 CRUD 的时间

    element-ui 因其组件丰富.可拓展性强.文档详细等优点成为 Vue 最火的第三方 UI 框架.element-ui 其本身就针对后台系统设计了很多实用的组件,基本上满足了平时的开发需求. 既然 ...

随机推荐

  1. 视频教学动作修饰语:CVPR2020论文解析

    视频教学动作修饰语:CVPR2020论文解析 Action Modifiers: Learning from Adverbs in Instructional Videos 论文链接:https://a ...

  2. 代码生成codegen

    代码生成codegen 该模块提供了从SymPy表达式生成直接可编译代码的功能.该codegen功能是SymPy中代码生成功能的用户界面.下面为可能希望直接使用框架的高级用户提供了一些实现细节. 注意 ...

  3. GPU端到端目标检测YOLOV3全过程(上)

    GPU端到端目标检测YOLOV3全过程(上) Basic Parameters: Video: mp4, webM, avi Picture: jpg, png, gif, bmp Text: doc ...

  4. JVM集合之开篇点题

    大家在平时的开发过程中是否遇到过StackOverflowError.OutOfMemoryError等类似的内存溢出错误呢?大家又是怎么解决这个问题的?再来,大家在面试过程中有没有被面试官提问过jv ...

  5. Pandas之:深入理解Pandas的数据结构

    目录 简介 Series 从ndarray创建 从dict创建 从标量创建 Series 和 ndarray Series和dict 矢量化操作和标签对齐 Name属性 DataFrame 从Seri ...

  6. vscode使用版本控制git commit unstaged时提示对话框的设置

    使用 vscode 版本控制提交代码时,如果有 unstaged file,会有一个弹出框: 选择 always 或者 never ,这个框下次就不再弹出了. 如果你想让他再次出现,请去setting ...

  7. 1738. 找出第 K 大的异或坐标值

    2021-05-19 LeetCode每日一题 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/ 标 ...

  8. .NET平台系列26:在 Windows 上安装 .NET Core/.NET5/.NET6

    系列目录     [已更新最新开发文章,点击查看详细] 本文介绍如何在 Windows 上安装 .NET. .NET 由运行时和 SDK 组成. 运行时用于运行 .NET 应用,应用可能包含也可能不包 ...

  9. 【NX二次开发】Block UI OrientXpress

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  10. markdown写ppt (史上最全)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...