自定义选项卡组件,选项可插槽html

文件夹xxtabs

四个文件 index暴露 render vue添加虚拟节点到插槽(自定义标签结构) tabs选项卡整体 abpaneq切换区

 tabs.vue

<template><div class="gnip-tab"><div class="gnip-tab-nav"><divv-for="(item, index) in tabNavList"@click.stop="handleTabNavClick(item, index)":class="['tab-nav-item', item.name == activeName ? 'active' : '']"ref="tabNavItemRefs"><div class="tab_item" v-if="typeof item.label === 'string'">{{ item.text }}</div><render v-else :params="item.label"></render></div></div><!-- 滚动滑块 --><div class="tab-content-wrap"><slot></slot></div></div>
</template>
<script>
// render组件,label为render函数的时候进行渲染
import Render from "./render";
export default {props: {// v-model的那项value: {type: String,},// 是否显示滑块背景showTrackBg: {type: Boolean,default: false,},tabWidth: {type: String,default: "",},},components: {Render,},data() {return {// tab数组tabNavList: [],// 当前活跃项activeName: "",// 滑块的宽度trackLineWidht: 0,// 当前活跃索引currentIndex: 0,// 滑块偏移量left: 0,// 拖拽开始的哪项dragOriginItemIndex: null,// 拖拽活跃项的索引dragStartIndex: null,};},mounted() {this.init();},methods: {// 初始化init() {// 默认当前活跃项为外部v-model的值this.activeName = this.value;},// 设置tab点击栏setTabBar(tabsPaneInstance, slotElement) {// tab的描述信息可以是字符串也可以是render函数const label = tabsPaneInstance.label,type = typeof label;// 添加到数组项中,根据添加条件渲染this.tabNavList.push({text: type == "function" ? "" : label,renderFun: type == "function" ? label : "",name: tabsPaneInstance.name,label: slotElement.tab === undefined ? label : slotElement.tab,});},handleTabNavClick(item, index) {console.log('name',item,index)if (item.name == this.activeName) return;// 更新当前活跃项this.activeName = item.name;// 活跃项的索引this.currentIndex = index;},// 交换tab数据项swap(start, end) {let startItem = this.tabNavList[start];let endItem = this.tabNavList[end];// 由于直接通过索引修改数组,无法触发响应式,因此需要$setthis.$set(this.tabNavList, start, endItem);this.$set(this.tabNavList, end, startItem);},},
};
</script><style scoped>
.gnip-tab {height: 100%;/* width: var(tabWidth); *//* width: 200px; */
}
.gnip-tab-nav {display: flex;position: relative;
}
.tab-nav-item {background-color: #074889;padding-left: 5px;padding-right: 5px;line-height: 18px;text-align: center;height: 24px;box-sizing: border-box;background: rgb(7, 72, 137);border-left: 1px solid rgb(44, 100, 155);border-right: 1px solid rgb(44, 100, 155);border-bottom: 1px solid rgb(44, 100, 155);border-radius: 0px 0px 5px 5px;
}
.tab-nav-item.active {background-color: #0078ef;
}
.tab-nav-track {width: 100%;position: relative;height: 2px;
}
.tab-content-wrap{height: calc(100% - 24px);
}
.track-line {height: 2px;background-color: #2d8cf0;position: absolute;transition: left 0.35s;
}
.tab_item {
}
</style>

tabPane.vue

<template><div class="gnip-tabs-pane" v-if="$parent.activeName === name"><!-- <transition :name="paneTransitionName"> --><div class="tab-pane-content" ><slot name="default"></slot><!-- <slot name="one"></slot> --></div><!-- </transition> --></div></template><script>export default {props: {label: {type: [String, Function],},name: {type: String,},disabled: {type: Boolean,default: false,},},data() {return {paneTransitionName: "enter-right",};},created() {this.$parent.setTabBar(this,this.$slots);},mounted(){},};</script><style scoped>.gnip-tabs-pane {height: 100%;overflow-x: hidden;}
.tab-pane-content{height: inherit;
}</style>

render.js

import { h } from 'vue'export default {data() {return {msg: 'hello'}},props:{params: {type: Function,default() {return function(){};},},},render() {
//获取插槽内容创建成divreturn h('div', this.params())}
}

index.js

import TabPane from "./TabPane.vue";
import Tabs from "./Tabs.vue";
export { Tabs, TabPane };

使用

引入

import { Tabs, TabPane } from "@/components/SreenTabs";

使用

        <Tabs style="margin-left: 10px" :value="logTabName" show-track-bg><TabPane label="日志" name="日志">日志文本</TabPane><TabPane label="消息" name="消息"><template v-slot:tab><n-badge :value="8" :offset="[5, -2]"><text style="color: white">消息</text></n-badge></template>消息文本</TabPane><TabPane label="异常" name="异常">异常文本</TabPane></Tabs>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/5813.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单易懂:Vue3框架三天速成(一)

前言&#xff1a;学习Vue框架首先需要具备基本的HTML5、CSS3、JavaScript基础&#xff0c;了解基本概念以及用法再来学习Vue会事半功倍&#xff01; 一、初识Vue Vue.js&#xff08;读音 /vjuː/, 类似于 view&#xff09; 是一套构建用户界面的渐进式框架。Vue 只关注视图层&a…

【数据库七】MySQL主从复制与读写分离

MySQL主从复制与读写分离 1.MySQL读写分离1.1 什么是读写分离&#xff1f;1.2 为什么要读写分离呢&#xff1f;1.3 什么时候要读写分离&#xff1f;1.4 主从复制与读写分离 2.MySQL主从复制原理2.1 MySQL复制类型2.2 主从复制工作过程2.2.1 MySQL架构图2.2.2 书面化工作过程 2.…

Linux内核TCP参数调优全面解读

Linux内核TCP参数调优全面解读 前言 TCP 性能的提升不仅考察 TCP 的理论知识&#xff0c;还考察了对于操心系统提供的内核参数的理解与应用。 TCP 协议是由操作系统实现&#xff0c;所以操作系统提供了不少调节 TCP 的参数。 如何正确有效的使用这些参数&#xff0c;来提高 T…

使用影刀RPA合并excel数据

合并不同sheet&#xff1a; 先获取不同sheet中的表头&#xff0c;合并所有表头并去重存作列表&#xff0c;新建excel在第一行插入该表头数据,作合并数据存放使用循环方法&#xff0c;依次获取每个sheet的数据&#xff0c;用if判断表头是否在1的列表中&#xff0c;在的话则将整…

【unity】RenderFeature的应用(生成水平面的网格线)

【unity】RenderFeature的应用&#xff08;生成水平面的网格线&#xff09; 在URP里RenderFeature是用于后处理效果上的&#xff0c;也还可以实现一些特殊的效果&#xff0c;比如生成网格线。我们可以使用 CommandBuffer来创建地面网格&#xff0c;这样的话可以通过调整 Comman…

“GPT+健康医疗”赋能医疗行业“数智化”发展,景联文科技提供高质量医疗数据库

近日&#xff0c;ChatGPT这个代表着通用版的大型语言模型以其出色的表现在全球互联网上引人注目。它所使用的GPT技术基础为人工智能应用开启了全新的世界。 “大模型时代已经到来。它已变成基础设施&#xff0c;变成算力&#xff0c;变成生产力。大模型可能有通用技术&#xf…

MidJourney v5.2 、Stable Diffusion XL 0.9 出图对比

最近两个最流行的AI图像生成器&#xff0c;Midjourney和Stable Diffusion&#xff0c;都发布了重大更新。Midjourney v5.2引入了许多新功能&#xff0c;包括“缩小”功能、“/缩短”命令、改进的图像质量等。 Stable Diffusion XL (SDXL) 0.9则专注于改善图像质量和构图。新模…

在linux中快速安装Redis数据库

Redis中文网 点击该链接下载最5.0.4版本的Redis的压缩包 使用Xftp工具将Redis安装包上传到linux中 1.将压缩包解压到/opt目录下: tar -zxvf redis-5.0.4.tar.gz 2. 更新yun: sudo yum makecache fast 3.安装gcc: yum -y install gcc 4.安装完成通过输入 : gcc -v …

黑马Java项目实战-瑞吉外卖-笔记01

视频地址&#xff1a;黑马程序员Java项目实战《瑞吉外卖》&#xff0c;轻松掌握springboot mybatis plus开发核心技术的真java实战项目_哔哩哔哩_bilibili资料下载&#xff1a;百度网盘【黑马程序员-Java瑞吉外卖-企业级项目实战-平台实战开发】 黑马Java项目实战-瑞吉外卖-笔…

接口测试必备技能-常见接口协议解析

服务与服务之间传递数据包&#xff0c;往往会因为不同的应用场景&#xff0c;使用不同的通讯协议进行传递。比如网站的访问&#xff0c;常常会使用 HTTP 协议进行传递&#xff0c;文件传输使用 FTP&#xff0c;邮件传递使用 SMTP。上述的三种类型的协议都处于网络模型中的应用层…

Hello算法笔记之回溯

一、回溯算法介绍&#xff1a;一种通过穷举来解决问题的方法&#xff0c;它的核心思想是从一个初始状态出发&#xff0c;暴力搜索所有可能的解决方案&#xff0c;当遇到正确的解则将其记录&#xff0c;直到找到解或者尝试了所有可能的选择都无法找到解为止。 通常采用「深度优…

redis-哨兵安装

解决问题 自动故障修复 1.在主从模式的基础上,在主节点添加自己的认证密码即可 2.将代码客户端地址改为哨兵地址 ------------- 主节点配置 daemonize yes port 6379 bind 0.0.0.0 requirepass 123456 save 3600 1 300 100 60 10000dir /usr/local/redis dbfilename dump.r…