Files
2026-01-29 17:54:35 +08:00

96 lines
2.9 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// utils/nav.uts
import type { MenuItem, MenuGroup, MenuChild } from '../types.uts'
export function findActiveByCurrentPage(
menuList: MenuItem[],
currentPage: string
): { activeMenuId: string, activeSubId: string } {
const page = currentPage || ''
// 1) currentPage 直接是一级 menu id
const mById = menuList.find(m => m.id === page)
if (mById) {
const leaf = firstLeafOfMenu(mById)
return { activeMenuId: mById.id, activeSubId: leaf?.id ?? '' }
}
// 2) currentPage 是 path/pages/xxx 或 pages/xxx
const pageNorm = normalize(page)
for (const m of menuList) {
const groups = m.groups ?? []
// group / child / 四级 全部扫描
for (const g of groups) {
// group 叶子(可选)
if (g.path && normalize(g.path) === pageNorm) {
return { activeMenuId: m.id, activeSubId: '' }
}
const cs = g.children ?? []
for (const c of cs) {
// 用 id 命中
if (c.id === page) return { activeMenuId: m.id, activeSubId: c.id }
// 用 path 命中
if (c.path && normalize(c.path) === pageNorm) return { activeMenuId: m.id, activeSubId: c.id }
// 四级
const ds = c.children ?? []
const hit = findInChildren(ds, page, pageNorm)
if (hit) return { activeMenuId: m.id, activeSubId: hit.id }
}
}
}
// 3) 找不到:兜底 home
return { activeMenuId: 'home', activeSubId: '' }
}
function findInChildren(list: MenuChild[], targetId: string, targetPathNorm: string): MenuChild | null {
for (const n of list) {
if (n.id === targetId) return n
if (n.path && normalize(n.path) === targetPathNorm) return n
const deep = n.children ?? []
if (deep.length > 0) {
const hit = findInChildren(deep, targetId, targetPathNorm)
if (hit) return hit
}
}
return null
}
function normalize(p: string): string {
if (!p) return ''
const s = p.startsWith('/') ? p.slice(1) : p
const q = s.indexOf('?')
return q >= 0 ? s.slice(0, q) : s
}
// 你可以把 index.uvue 里的 firstLeafOfMenu 移到这里复用(保持逻辑一致)
function firstLeafOfMenu(m: MenuItem): MenuChild | null {
const gs = m.groups ?? []
if (gs.length === 0) return null
const g0 = gs[0]
const cs = g0.children ?? []
if (cs.length === 0) return null
let n = cs[0]
while (n.children && n.children.length > 0) n = n.children[0]
return n
}
export function getCurrentRoutePath(): string {
// 使用页面栈获取当前路由uni-app标准能力
// getCurrentPages 用于获取当前页面栈实例 :contentReference[oaicite:2]{index=2}
const pages = getCurrentPages()
const last: any = pages[pages.length - 1]
// #ifdef H5
return last?.route ? `/${last.route}` : ''
// #endif
// #ifndef H5
// 小程序/App 可能是 route / $page?.fullPath 形式,按你项目实际字段微调
return last?.route ? `/${last.route}` : (last?.$page?.fullPath || '')
// #endif
}