前言:平常,我们游览网站的时候,经常会看见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
如上如有问题,欢迎留言指正,谢谢。
版权声明:本文为博主原创文章,未经博主允许不得转载 。