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