feat: 入口路由更改

This commit is contained in:
zoujing committed 2026-09-18 17:18:08 +08:00
1 parent d53974504b
commit 5180b04558
10 files changed
+11 -11

No files matched your search

+64
View File
@@ -0,0 +1,64 @@
<script setup>
/**
* 主包壳页面:主页 / 权益 / 我的 三块面板同屏共存,底部 Tab 栏只渲染一次
* ---------------------------------------------------------------------------
*/
import { onMounted, ref } from "vue";
import { onShow } from "@dcloudio/uni-app";
import { TABS } from "@/constant";
import { consumePendingTab, registerTabController, setTabQuery } from "@/utils/nav";
import HomePanel from "@/views/home/index.vue";
import BenefitPanel from "@/views/benefit/index.vue";
import MinePanel from "@/views/mine/index.vue";
const active = ref("home");
const homeRef = ref(null);
const benefitRef = ref(null);
const mineRef = ref(null);
const panelRefs = { home: homeRef, benefit: benefitRef, mine: mineRef };
/** 面板按需刷新(切到它、或页面 onShow 时) */
const showPanel = (key) => panelRefs[key]?.value?.onPanelShow?.();
/**
* 切 Tab 的唯一入口:Tab 栏点击、页面内 switchTabTo(key, query)、登录回跳都汇到这里。
* query 用 nav 的内存透传(如 `?seg=mine`),由目标面板 onPanelShow 消费。
*/
const goTab = (key, query = "") => {
if (!TABS.some((t) => t.key === key)) return;
setTabQuery(query);
active.value = key;
showPanel(key);
};
onMounted(() => {
// 面板的 onMounted 早于本页 onMounted,此时 ref 已就绪
registerTabController({ go: goTab, getActive: () => active.value });
// 从子页 / 登录页切过来:nav 里可能压着待切 Tab(登录回跳、reLaunch 冷启)
const pending = consumePendingTab();
goTab(pending?.key || active.value, pending?.query || "");
});
onShow(() => {
// 从板块列表 / 详情 / 登录页等返回:让当前面板按需刷新(各家内部有幂等守卫)
showPanel(active.value);
});
</script>
<template>
<view class="relative h-screen w-full overflow-hidden">
<!-- 三块面板叠放同屏,靠 visibility 切换:见 script 头部的说明 -->
<view :class="['absolute inset-0', active === 'home' ? 'visible' : 'invisible']">
<HomePanel ref="homeRef" />
</view>
<view :class="['absolute inset-0', active === 'benefit' ? 'visible' : 'invisible']">
<BenefitPanel ref="benefitRef" />
</view>
<view :class="['absolute inset-0', active === 'mine' ? 'visible' : 'invisible']">
<MinePanel ref="mineRef" />
</view>
<AppTabBar :active="active" @change="goTab" />
</view>
</template>