no message

This commit is contained in:
hajimi
2026-06-11 12:15:29 +08:00
parent 10ebe39c30
commit 96efa1d905
5859 changed files with 815501 additions and 5 deletions
+163
View File
@@ -0,0 +1,163 @@
<template>
<view>
<UTabbar v-if="showTabbar" v-model="current" v-bind="tabbarStyle" :list="tabbarList" :mid-button="hasMidButton"
@change="handleChange" :hide-tab-bar="hideNativeTabbar"></UTabbar>
<AppLoading />
<GlobalPopup />
</view>
</template>
<script lang="ts" setup>
import { useAppStore } from '@/stores/app'
import { computed, ref, watch, onMounted } from 'vue'
import { onShow } from '@dcloudio/uni-app'
import AppLoading from '@/components/app-loading/app-loading.vue'
import GlobalPopup from '@/components/global-popup/global-popup.vue'
const MATCH_SHELL_VIEW_KEY = 'match_shell_view'
import UTabbar from '@/uni_modules/vk-uview-ui/components/u-tabbar/u-tabbar.vue'
const props = withDefaults(defineProps<{
forceShow?: boolean
activePagePath?: string
}>(), {
forceShow: false,
activePagePath: ''
})
const current = ref(0)
const appStore = useAppStore()
const showTabbar = ref(false)
const hideNativeTabbar = ref(false)
const nativeTabbar = [
'/pages/index/index',
'/pages/match/match',
'/pages/crypto/crypto',
'/pages/lottery_analysis/lottery_analysis',
'/pages/empty/empty',
'/pages/user/user'
]
const tabbarRouteAliasMap: Record<string, string> = {
'/pages/match/match': '/packages_match/pages/worldcup',
'/pages/lottery_analysis/lottery_analysis': '/packages_lottery/pages/index',
'/pages/empty/empty': '/packages_community/pages/index'
}
const tabbarList = computed(() => {
return appStore.getTabbarConfig
?.filter((item: any) => item.is_show == 1)
.map((item: any) => {
const link = typeof item.link === 'string' ? JSON.parse(item.link) : item.link
return {
iconPath: item.unselected,
selectedIconPath: item.selected,
text: item.name,
link: link,
pagePath: link.path,
midButton: !!link.midButton
}
})
})
const hasMidButton = computed(() => {
return tabbarList.value?.some((item: any) => item.midButton) || false
})
const getPageRoute = (page: any) => {
let route = page.route || ''
// H5下route可能带base前缀,需要去除
// #ifdef H5
route = route.replace(/^\//, '')
if (route.startsWith('mobile/')) {
route = route.replace('mobile/', '')
}
// #endif
return '/' + route
}
const normalizeTabbarRoute = (route?: string) => {
if (!route) {
return ''
}
return tabbarRouteAliasMap[route] || route
}
const isSameTabbarRoute = (left?: string, right?: string) => {
return normalizeTabbarRoute(left) === normalizeTabbarRoute(right)
}
const updateTabbarState = () => {
hideNativeTabbar.value = false
if (props.forceShow && props.activePagePath) {
const forceRoute = props.activePagePath
const idx = tabbarList.value?.findIndex((item: any) => isSameTabbarRoute(item.pagePath, forceRoute)) ?? -1
showTabbar.value = idx >= 0
if (idx >= 0) {
current.value = idx
}
return
}
const currentPages = getCurrentPages()
if (!currentPages.length) {
return
}
const currentPage = currentPages[currentPages.length - 1]
const rawCurrentRoute = getPageRoute(currentPage)
const currentRoute = normalizeTabbarRoute(rawCurrentRoute)
hideNativeTabbar.value = nativeTabbar.includes(rawCurrentRoute)
const idx = tabbarList.value?.findIndex((item: any) => {
return isSameTabbarRoute(item.pagePath, currentRoute)
})
showTabbar.value = idx >= 0
if (idx >= 0) {
current.value = idx
}
}
const syncCurrent = () => {
updateTabbarState()
setTimeout(updateTabbarState, 50)
setTimeout(updateTabbarState, 180)
setTimeout(updateTabbarState, 360)
}
onMounted(syncCurrent)
onShow(syncCurrent)
watch(() => appStore.tabbarTick, syncCurrent)
// tabbarList 变化(API 加载完成)时主动 bump tick 触发重算
watch(() => tabbarList.value, () => {
appStore.tabbarTick++
syncCurrent()
}, { deep: true })
const tabbarStyle = computed(() => ({
activeColor: appStore.getStyleConfig?.selected_color || '#0b55eb',
inactiveColor: appStore.getStyleConfig?.default_color || '#999999'
}))
const handleChange = (index: number) => {
const selectTab = tabbarList.value[index]
const targetRoute = normalizeTabbarRoute(selectTab?.pagePath)
console.log('[Tabbar] 切换tab:', index, selectTab?.text, selectTab?.pagePath, '=>', targetRoute)
if (!targetRoute) {
return
}
// 防止重复跳转当前页面
const currentPages = getCurrentPages()
if (currentPages.length) {
const curRoute = getPageRoute(currentPages[currentPages.length - 1])
if (isSameTabbarRoute(curRoute, targetRoute)) return
}
if (selectTab.midButton) {
uni.navigateTo({ url: targetRoute })
return
}
if (targetRoute === '/packages_match/pages/worldcup') {
uni.setStorageSync(MATCH_SHELL_VIEW_KEY, 'worldcup')
}
if (nativeTabbar.includes(targetRoute)) {
uni.switchTab({ url: targetRoute })
} else {
uni.reLaunch({ url: targetRoute })
}
}
</script>