feat: 入口路由更改
This commit is contained in:
1 parent
d53974504b
commit
5180b04558
10 files changed
+11
-11
No files matched your search
@@ -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>
|
||||
Reference in new issue
Block a user