视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Vue2.0 多 Tab切换组件的封装实例
2020-11-27 22:33:57 责编:小采
文档

Vue2.0 多 Tab切换组件简单封装,满足自己简单的功能,可以直接拿去使用!

首先上效果图:

功能简单介绍:

1、支持tab切换

2、支持tab定位

3、支持tab自动化

仿React多Tab实现,总之可以正常使用满足日常需求,

1、使用方法:

==index.vue文件==

<TabItems>
 <div name="买入" class="first">
 <Content :isContTab = "0" />
 </div>
 <div name="自动再平衡" class="second">
 <Content :isContTab = "1" />
 </div>
 <div name="一键卖出" class="three">
 <Content :isContTab = "2" />
 </div>
</TabItems>

PS:TabItems是我的TabSwitch组件,tab页面标题就是 div 中的name值,俩面是内容,也可以是子组件。

接下来展示TabItems组件

2、组件

index.less文件

body,html {margin: 0;}

* {
 opacity: 1;
 -webkit-backface-visibility: hidden;
}

.tabItems {
 .Tab_tittle_wrap {
 position: absolute;
 width: 100%;
 top: 0;
 z-index: 2;
 background: @ffffff;
 display: -webkit-box;
 height: 80px;
 line-height: 80px;
 text-align: center;
 color: @222222;
 border-bottom: 1px solid rgba(46, 177, 255, 0.08);
 box-shadow: 0px 0px 25px 6px rgba(46, 177, 255, 0.21);
 span {
 display: block;
 text-align: center;
 width: 26%;
 margin: 0 24px;
 font-size: 26px;
 position: relative;
 i {
 display: inline-block;
 position: absolute;
 width: 1px;
 height: 50px;
 top: 15px;
 right: -24px;
 background: @dddddd;
 }
 &:last-child {
 i {
 display: none;
 }
 }
 }
 .router-link-active {
 color: #8097f9;
 border-bottom: 1px solid #8097f9;
 }
 }
 .Tab_item_wrap {
 position: absolute;
 top: 82px;
 width: 100%;
 z-index: 0;
 background: @ffffff;
 bottom: 0;
 overflow-x: hidden;
 -webkit-overflow-scrolling: touch;
 }
 .showAnminous {
 opacity: 1;
 -webkit-backface-visibility: hidden;
 -webkit-animation-name: "rightMove";
 /*动画名称,需要跟@keyframes定义的名称一致*/
 -webkit-animation-duration: .3s;
 /*动画持续的时间长*/
 -webkit-animation-iteration-count: 1;
 /*动画循环播放的次数为1 infinite为无限次*/
 }
}

@-webkit-keyframes rightMove {
 0% {
 -webkit-transform: translate(110%, 0);
 }
 100% {
 -webkit-transform: translate(0, 0);
 }
}

@-ms-keyframes rightMove {
 0% {
 -ms-transform: translate(110%, 0);
 }
 100% {
 -ms-transform: translate(0, 0);
 }
}

@keyframes rightMove {
 0% {
 -webkit-transform: translate(110%, 0);
 -ms-transform: translate(110%, 0);
 transform: translate(110%, 0);
 }
 100% {
 -webkit-transform: translate(0, 0);
 -ms-transform: translate(0, 0);
 transform: translate(0, 0);
 }
}

TabItems.vue

<template>
 <div class="tabItems">
 <div class="Tab_tittle_wrap" @click="tabswitch">
 <span v-for="(v,i) in tabTitle" :style="{width:(100/tabTitle.length-7.5)+'%'}" :class="isShowTab==i?'router-link-active':''">{{v}}<i></i></span>
 </div>
 <div class="Tab_item_wrap">
 <slot></slot>
 </div>
 </div>
</template>

<style lang="less">
 @import "./less/index";
</style>
<script>
 export default {
 data() {
 return {
 tabTitle: [],
 isShowTab: 0,
 }
 },
 created: function() {
 let is = sessionStorage.getItem("isTabShow");
 if(is) {
 this.isShowTab = is;
 } else {
 let URL = libUtils.GetURLParamObj();
 this.isShowTab = URL.isShowTab ? URL.isShowTab : "0";
 }

 setTimeout(function() {
 this.tabswitch(document.querySelector(".Tab_tittle_wrap").children[this.isShowTab].click());
 }.bind(this), 0);
 },
 mounted() {
 let slot = this.$slots.default;
 for(let i = 0; i < slot.length; i++) {
 if(slot[i].tag == "div") {
 this.tabTitle.push(slot[i].data.attrs.name);
 if(slot[i].elm) {
 slot[i].elm.className = "hide";
 if(this.isShowTab == i) {
 slot[i].elm.className = "";
 }
 };
 }
 }
 },
 methods: {
 tabswitch() {
 if(!event) return;
 let target = event.target;

 if(target.nodeName.toLowerCase() !== 'span') {
 return;
 }

 let len = target.parentNode.children;
 for(let i = 0; i < len.length; i++) {
 len[i].index = i;
 len[i].removeAttribute('class');
 }
 target.setAttribute('class', 'router-link-active');
 this.isShowTab = target.index;

 //tabItems
 let child = this.$el.children[1].children;
 for(let k = 0; k < child.length; k++) {
 child[k].className = "hide";
 if(k == target.index) {
 child[k].className = "showAnminous";
 }
 }
 try {
 sessionStorage.setItem("isTabShow", target.index);
 } catch(err) {
 console.log(err);
 }
 }
 }
 }
</script>

PS:

created、mounted这两个方法不需要过多介绍,Vue生命周期

1、created方法介绍。

获取浏览器链接地址:libUtils.GetURLParamObj();获取浏览器链接地址的

created这个方法主要是用来定位tab具体显示哪个页面的

2、mounted方法介绍

主要是用于隐藏内容容器的

3、tabswitch方法

用来切换组件容器的显示的页面!

下载本文
显示全文
专题