diff --git a/package.json b/package.json index f44da99..273d366 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ln-bi", "private": true, - "version": "1.1.2", + "version": "1.1.3", "type": "module", "scripts": { "dev": "concurrently -n server,client -c blue,green \"npm run dev:server\" \"npm run dev:client\"", diff --git a/src/components/Shell.tsx b/src/components/Shell.tsx index b94d355..fd6a4ee 100644 --- a/src/components/Shell.tsx +++ b/src/components/Shell.tsx @@ -1,5 +1,6 @@ import { useState, useEffect, useMemo, type ComponentType } from 'react'; import { useAuth } from '../auth/useAuth'; +import { DemoModeProvider } from './Blur'; export interface ModuleConfig { id: string; @@ -44,14 +45,19 @@ export function Shell({ modules }: { modules: ModuleConfig[] }) { }, [modules]); useEffect(() => { - // 同步 hash 到当前模块 + // 同步 hash 到当前模块:使用 replaceState 避免产生多余的 history 记录, + // 否则在小程序/webview 环境下首次进入需要点两次返回才能退出 if (window.location.hash.slice(1) !== activeModule) { - window.location.hash = activeModule; + const { pathname, search } = window.location; + window.history.replaceState(null, '', `${pathname}${search}#${activeModule}`); } }, [activeModule]); const switchModule = (id: string) => { - window.location.hash = id; + if (window.location.hash.slice(1) === id) return; + const { pathname, search } = window.location; + window.history.replaceState(null, '', `${pathname}${search}#${id}`); + setActiveModule(id); }; const ActiveComponent = modules.find((m) => m.id === activeModule)?.component ?? modules[0]?.component; @@ -64,6 +70,7 @@ export function Shell({ modules }: { modules: ModuleConfig[] }) { }, [user]); return ( +
{/* 全局水印 */}
@@ -117,5 +124,6 @@ export function Shell({ modules }: { modules: ModuleConfig[] }) { })}
+ ); }