爱简收旧衣按件回收前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

135 lines
3.2 KiB

<template>
<view class="tab-bar">
<view
v-for="(item, index) in tabList"
:key="index"
class="tab-item"
:class="{ active: currentTab === item.pagePath }"
@tap="switchTab(item.pagePath)"
>
<image
:src="currentTab === item.pagePath ? item.selectedIconPath : item.iconPath"
class="tab-icon"
></image>
<text>{{ item.text }}</text>
</view>
</view>
</template>
<script>
export default {
name: 'UserTabBar',
data() {
return {
currentTab: '/pages/component/home',
tabList: [
{
pagePath: '/pages/component/home',
text: '首页',
iconPath: '/static/logo.png',
selectedIconPath: '/static/logo.png'
},
{
pagePath: '/pages/component/recycle',
text: '回收',
iconPath: '/static/logo.png',
selectedIconPath: '/static/logo.png'
},
{
pagePath: '/pages/component/my',
text: '我的',
iconPath: '/static/logo.png',
selectedIconPath: '/static/logo.png'
}
]
}
},
methods: {
switchTab(path) {
if (this.currentTab === path) return
// 立即更新当前选中状态
const oldPath = this.currentTab
this.currentTab = path
// 进行路由跳转
uni.switchTab({
url: path,
success: () => {
// 跳转成功,状态已经更新
console.log('切换成功')
},
fail: () => {
// 如果switchTab失败,尝试navigateTo
uni.navigateTo({
url: path,
success: () => {
console.log('导航成功')
},
fail: () => {
// 如果都失败了,恢复原来的状态
this.currentTab = oldPath
console.log('切换失败')
}
})
}
})
},
updateCurrentTab() {
const pages = getCurrentPages()
if (pages.length > 0) {
const currentPage = pages[pages.length - 1]
const newPath = '/' + currentPage.route
// 只在路径真正改变时才更新
if (this.currentTab !== newPath) {
this.currentTab = newPath
}
}
}
},
created() {
this.updateCurrentTab()
},
onShow() {
this.updateCurrentTab()
},
onLoad() {
// 页面加载时更新当前tab
this.updateCurrentTab()
}
}
</script>
<style lang="scss" scoped>
.tab-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 100rpx;
background: #fff;
display: flex;
padding-bottom: env(safe-area-inset-bottom);
border-top: 1px solid #f5f5f5;
z-index: 1000;
.tab-item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #999;
gap: 4rpx;
.tab-icon {
width: 48rpx;
height: 48rpx;
}
&.active {
color: #00C853;
}
}
}
</style>