用vue.js实现tab切换效果

前言:平常,我们游览网站的时候,经常会看见tab标签的切换效果,tab切换效果在前端UI框架中也是很常见的。这次,我们在vue项目中,实现一下这个tab切换效果。

          tab的切换,一般是点击上方的标题,下方的内容块随之切换,上方的标题栏和下方的内容块是并列的关系,通过标签一一对应,点击相对应的标签id,来实现对应tab的切换。

一、HTML结构

       tab切换第一步先要把html结构写好,搭建页面布局,主要分为两块结构:

<div id="app">
    <ul class="tab-tilte flex_cen">
        <li @click="cur=0" :class="{active:cur==0}" class="cgBox_l">分钟</li>
        <li @click="inquiryHour(cur=1)" :class="{active:cur==1}" class="cgBox_ll">小时</li>
        <li @click="inquiryDay(cur=2)" :class="{active:cur==2}" class="cgBox_ll">每日</li>
        <li @click="inquiryTotal(cur=3)" :class="{active:cur==3}" class="cgBox_r">汇总</li>
    </ul>
    <div class="tab-content">
        <div v-show="cur==0">
            <table>
                <tbody>
                    <tr style="background-color:#81b5fe;color:#fff;height:40px;">
                        <td width="25%">开始时间</td>
                        <td width="25%">结束时间</td>
                        <td width="25%">当日<br>件数</td>
                        <td width="25%">当日<br>保费</td>
                    </tr>
                    <tr v-for="item in list1" :key="item.id" class="cellTr">
                        <td>{{item.transDate+''+item.beginTime}}</td>
                        <td>{{item.transDate+''+item.endTime}}</td>
                        <td>{{item.polnumByMinute}}</td>
                        <td>{{item.premByMinute}}</td>
                    </tr>
                </tbody>
            </table> 
        </div>
        <div v-show="cur==1">
            <table>
                <tbody>
                    <tr class="trFirst" style="height:40px;">
                        <td width="25%">开始时间</td>
                        <td width="25%">结束时间</td>
                        <td width="25%">当日<br>件数</td>
                        <td width="25%">当日<br>保费</td>
                    </tr>
                    <tr v-for="item in list2" :key="item.index" class="cellTr">
                        <td>{{item.transDate+''+item.beginTime}}</td>
                        <td>{{item.transDate+''+item.endTime}}</td>
                        <td>{{item.polnumByHour}}</td>
                        <td>{{item.premByHour}}</td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div v-show="cur==2">
            <table>
                <tbody>
                    <tr style="background-color:#81b5fe;color:#fff;height:40px;">
                        <td width="33.33%">时间</td>
                        <td width="33.33%">件数</td>
                        <td width="33.33%">保费</td>
                    </tr>
                    <tr v-for="item in list3" :key="item.id" class="cellTr">
                        <td>{{item.transDate}}</td>
                        <td>{{item.polnumByDay}}</td>
                        <td>{{item.premByDay}}</td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div v-show="cur==3">
            <table>
                <tbody>
                    <tr class="trFirst" style="height:40px;">
                        <td width="50%">当日件数</td>
                        <td width="50%">当日保费</td>
                    </tr>
                    <tr v-for="item in list4" :key="item.index" class="cellTr">
                        <td>{{item.polnumTotal}}</td>
                        <td>{{item.premTotal}}</td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
</div>

二、script部分

<script>
export default{
created(){
//分钟
    this.GLOBAL.get("policy/query/dataReport?reqType=4",'',(res,sta)=> {
        if(sta == 1){
            this.list1 = res.result;
            this.list2 = [];
            this.list3 = [];
            this.list4 = [];
            console.log("请求成功");
        }else if(sta == 0){
            this.GLOBAL.showToast('查询不到,请重试!');
            console.log("请求失败");
        }
    });
},
methods:{
//小时
 inquiryHour(){
    this.GLOBAL.get("policy/query/dataReport?reqType=3",'',(res,sta)=>{
    if(sta == 1){
        this.list2 = res.result;
        this.list3 = [];
        this.list4 = [];
        console.log("请求成功");
    }else if(sta == 0){
        this.GLOBA.showToast('查询不到,请重试!')
        console.log("请求失败");
    }
    });
 },
//每日
  inquiryDay(){
    this.GLOBAL.get("policy/query/dataReport?reqType=2",'',(res,sta) => {
        if(sta == 1){
            this.list3 = res.result;
            this.list2 = [];
            this.list4 = [];
            console.log("请求成功");
        }else if(sta == 0){
            this.GLOBAL.showToast('查询不到,请重试!');
            console.log("请求失败");
        }
    });
 },
//汇总
  inquiryTotal(){
    this.GLOBAL.get("policy/query/dataReport?reqType=1",'',(res,sta) =>{
        if(sta == 1){
            this.list4 = res.result;
            this.list2 = [];
            this.list3 = [];
            console.log("请求成功");
        }else if(sta == 0){
            this.GLOBAL.showToast('查询不到,请重试!')
            console.log("请求失败");
        }
    }); 
  },
},
mounted(){
},
data(){
    return{
     cur:0,
     list1:[],
     list2:[],
     list3:[],
     list4:[],
  };
 },
};
</script>

三、样式部分

<style scope>
header>img{display: block;max-width:100%;height:auto;}
.red{color:red;font-size:16px;padding-left:5px;}
.totalMon,.total-right{font-weight: bold;font-size: 16px;}
.dataTitle{margin-bottom:10px;}
.cgBox_l,.cgBox_r,.cgBox_ll{width: 22%;display: inline-block;height: 34px;line-height: 34px;text-align: center;font-size: 14px;background: #fff;color: #333;border: 1px solid #81b5fe;}
.cgBox_l {border-top-left-radius: 17px;border-bottom-left-radius: 17px;}
.cgBox_r {border-top-right-radius: 17px;border-bottom-right-radius: 17px;}
.tab-tilte .active{background: #81b5fe;color: #fff;}
.nowDate{text-align: right;padding-top: 15px;display: block;font-size: 16px;}
table{width:100%;border:1px solid #666;margin-top: 6px;border-spacing: 0;border-collapse: collapse;text-align: center;}
.input-line{height: 30px;margin-bottom: 10px;}
.trFirst{background-color:#81b5fe; color:#fff;}
.tr-total{color:red;font-weight: bold;}
tr:nth-child(2n){background:#e0ecfb;}
td{border: 1px solid #ccc;}
.cellTr{height:30px;}
</style>

四、tab切换效果改进语优化

       (1)可以发现当标题和内容不断增多时,我们要不停的添加cur的索引值,因此,有必要改进一下代码的写法;

       (2)利用vue提供的v-for指令遍历得到索引和值,如下所示:

<div id="app">
    <ul class="tab-list">
        <li v-for="(title,index) in tabTitle" @click="cur=index" :class="{active:cur==index}">{{title}}</li>
    </ul>
    <div class="tab-content">
        <div v-for="(m,index) in tabMain" v-show="cur==index">{{m}}</div>
    </div>
</div>
<script type="text/javascript">
window.onload = function(){
    var app = new Vue({
      el:'#app',
      data:{
        tabTitle:['标题一','标题二','标题三','标题四'],
        tabMain:['内容一','内容二','内容三','内容四'],
        cur:0 //默认选中第一个tab
    }
    })
}
</script>

相关图片:

  

参考博客:09Vue.js实现tab切换效果--简书 https://www.jianshu.com/p/52441745d769

如上如有问题,欢迎留言指正,谢谢。

版权声明:本文为博主原创文章,未经博主允许不得转载 。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值