You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

300 lines
6.7 KiB
Vue

2 years ago
<template>
<view class="tarbar savepadding">
<view class="tarbar-list" :style="{
background: tabBar.backgroundColor,
color: tabBar.color,
'border-top': tabBar.position == 'bottom' ? '1rpx solid ' + tabBar.borderStyle : 0,
'border-bottom': tabBar.position == 'top' ? '1rpx solid ' + tabBar.borderStyle : 0,
'padding-bottom': paddingHeight + 'px',
}">
<view class="tarbar-list-ul">
<view class="tarbar-list-li" :class="{'tarbar-list-li-center': item.type == 'center'}"
v-for="(item, index) in tabBar.list" :key="index" @click.top="setSelected(index)">
<block v-if=" item.type != 'center'">
<view class="tarbar-list-li-icon">
<text class="tab-icon iconfont active" :class="item.iconClick"
v-if="selected == index"></text>
<text class="tab-icon iconfont" :class="item.icon" v-else></text>
</view>
<view :style='selected == index?"color:"+tabBar.selectedColor:""' class="tarbar-list-li-name">
{{ item.text }}
</view>
</block>
<view class="center-box" v-else>
<view class="tarbar-list-li-icon">
<text class="tab-icon iconfont" :class="[item.icon ,{'active': selected == index }]"></text>
</view>
<view :style='selected == index?"color:"+tabBar.selectedColor:""' class="tarbar-list-li-name">
{{ item.text }}
</view>
</view>
<view class="bg" v-if=" item.type == 'center'"></view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
tabBar: {
color: '#999999',
selectedColor: '#FE7F00',
borderStyle: 'white',
backgroundColor: '#fff',
position: 'bottom',
list: [{
"type": 'normal',
"pagePath": "/pages/homePage/manifest/manifest",
"icon": 'icon-yunshu1',
"iconClick": 'icon-yunshugongsi',
"text": "航单",
"bgColor": '#ffffff',
"fontColor": '#333333',
"title": '航单',
},
{
"type": 'normal',
"pagePath": "/pages/homePage/moveTrace/moveTrace",
// "pagePath": "/pages/chatList/chatList",
"icon": "icon-yunshu1",
"iconClick": 'icon-yunshugongsi',
"text": "运踪",
"bgColor": '#ffffff',
"fontColor": '#333333',
"title": '运踪',
},
{
"type": 'center',
"pagePath": "/pages/home/home",
"icon": "icon-xinzeng",
"iconClick": 'icon-xinzeng',
"text": "首页",
"bgColor": '#2c96fb',
"fontColor": '#ffffff',
"title": '欢迎来到大简云',
},
{
"type": 'normal',
"pagePath": "/pages/homePage/vgm/vgm",
"icon": "icon-yunshu1",
"iconClick": 'icon-yunshugongsi',
"text": "VGM",
"bgColor": '#ffffff',
"fontColor": '#333333',
"title": '航单',
},
{
"type": 'normal',
"pagePath": "/pages/mine/mine",
"icon": "icon-yunshu1",
"iconClick": 'icon-yunshugongsi',
"text": "我的",
"bgColor": '#0e72f0',
"fontColor": '#ffffff',
"title": '个人中心',
}
]
},
selected: this.current, //当前激活项
paddingHeight: 0,
};
},
props: {
current: {
// type: [Number, String],
type: Number,
default: 0
},
},
mounted() {
this.paddingHeight = uni.getSystemInfoSync().safeArea.bottom - uni.getSystemInfoSync().safeArea.height - 20;
// this.paddingHeight = getApp().globalData.tabBarBottom;
},
methods: {
setSelected1(index) {
if (this.selected == index) return
let pages = getCurrentPages();
let lastIndex = null;
pages.map((pItem, pIndex) => {
let page = pItem.$page.fullPath;
console.log(page, this.tabBar.list[index].pagePath, index)
if (page == this.tabBar.list[index].pagePath) {
console.log('=====切换======', page, this.tabBar.list[index].pagePath, index)
lastIndex = pIndex;
}
})
console.log('==== 切换导航 ====', lastIndex)
if (lastIndex && pages[lastIndex].$page.fullPath == this.tabBar.list[index].pagePath) {
uni.navigateBack({
delta: -lastIndex
});
} else {
uni.navigateTo({
url: this.tabBar.list[index].pagePath,
})
}
},
setSelected(index) {
if (this.selected == index) return
this.$emit('change', index)
},
},
watch: {
current: {
handler(val) {
this.selected = val
const _this = this
uni.setNavigationBarTitle({
title: _this.tabBar.list[val].title
})
uni.setNavigationBarColor({
frontColor: _this.tabBar.list[val].fontColor,
backgroundColor: _this.tabBar.list[val].bgColor,
animation: {
duration: 400,
timingFunc: 'easeIn'
}
})
},
immediate: true
},
}
}
</script>
<style>
.tarbar {
width: 100%;
z-index: 9999;
position: fixed;
}
.tarbar-list {
width: 100%;
min-height: 110rpx;
/* padding-bottom: var(--status-bar-height); */
background: #4d586f;
position: fixed;
left: 0;
bottom: 0;
animation-name: example;
animation-duration: .5s;
box-shadow: 0 0 30rpx #ccc;
}
@keyframes example {
from {
bottom: -100%;
}
to {
bottom: 0;
}
}
.tarbar-list-ul {
width: 100%;
height: 110rpx;
padding: 10rpx 46rpx;
display: flex;
justify-content: space-between;
box-sizing: border-box;
}
.tarbar-list-li {
width: 80rpx;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
}
.tarbar-list-li-icon {
width: 50rpx;
height: 50rpx;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
}
.tarbar-list-li-icon image {
width: 36rpx;
height: 36rpx;
}
.tarbar-list-li-icon .tab-icon {
font-size: 52rpx;
}
.tarbar-list-li-icon .active {
color: #FF5A23;
}
.tarbar-list-li-name {
width: 100%;
text-align: center;
line-height: 30rpx;
font-size: 22rpx;
height: 30rpx;
}
.tarbar-list-li-center {
width: 100rpx;
background: #fff;
height: 100rpx;
margin-top: -28px;
border-radius: 50%;
position: relative;
box-shadow: 0 -10rpx 15rpx -5rpx #ccc;
}
.center-box {
position: absolute;
top: 0;
left: 0;
width: 100rpx;
height: 140rpx;
padding-top: 36rpx;
z-index: 2;
}
.tarbar-list-li-center .bg {
position: absolute;
top: 23px;
left: -12px;
width: 150rpx;
height: 76rpx;
z-index: 0;
background: #fff;
}
.center-box .tarbar-list-li-icon {
margin-bottom: 19rpx;
}
.center-box .tarbar-list-li-icon .iconfont {
font-size: 76rpx;
margin-bottom: 10rpx;
}
/* .savepadding{
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
box-sizing: content-box;
}
.savebottom{
bottom: constant(safe-area-inset-bottom);
bottom: env(safe-area-inset-bottom);
} */
</style>