Vue2.0 多 Tab切换组件的封装实例


Posted in Javascript onJuly 28, 2017

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

首先上效果图:

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方法

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
收藏Javascript中常用的55个经典技巧
Aug 12 Javascript
由Javascript实现的页面日历
Nov 04 Javascript
jQuery登陆判断简单实现代码
Apr 21 Javascript
javascript中自定义对象的属性方法分享
Jul 12 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
Oct 17 Javascript
原生js实现模拟滚动条
Jun 15 Javascript
jquery mobile界面数据刷新的实现方法
May 28 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
Dec 29 Javascript
node.js 利用流实现读写同步,边读边写的方法
Sep 11 Javascript
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
使用 Vue 实现一个虚拟列表的方法
Aug 20 Javascript
element-ui中el-upload多文件一次性上传的实现
Dec 02 Javascript
webpack实现热更新(实施同步刷新)
Jul 28 #Javascript
BootStrap Fileinput上传插件使用实例代码
Jul 28 #Javascript
解决React Native端口号修改的方法
Jul 28 #Javascript
vue+vux实现移动端文件上传样式
Jul 28 #Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
Jul 28 #Javascript
vue使用vue-cli快速创建工程
Jul 28 #Javascript
用JS实现简单的登录验证功能
Jul 28 #Javascript
You might like
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
用PHP读取IMAP邮件
2006/10/09 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
PHP 实现缩略图
2021/03/09 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
jQuery.each使用详解
2015/07/07 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python中web框架的自定义创建
2019/09/08 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
python实现磁盘日志清理的示例
2020/11/05 Python
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
学术会议主持词
2014/03/17 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
2015年林业工作总结
2015/05/14 职场文书
刑事辩护词范文
2015/05/21 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
Python time库的时间时钟处理
2021/05/02 Python