diff --git a/common/js/util.js b/common/js/util.js index 74b0b79..64779a4 100644 --- a/common/js/util.js +++ b/common/js/util.js @@ -115,29 +115,83 @@ export const adaptSubpackageUrl = (url) => { * 检查tabBar是否激活 * @param {string} linkUrl 链接路径 /pages/goods/category * @param {string} currentPageRoute 当前页面路径 /pages_goods/category + * @param {Object} tabBarList tabBar配置对象,用于动态判断 + * @param {Object} packageEntryTab 追踪每个分包的入口Tab { 'pages_goods': '/pages_goods/category' } * @returns {boolean} 是否激活 */ -export const checkTabBarActive = (linkUrl, currentPageRoute) => { - const linkUrlParts = adaptSubpackageUrl(linkUrl).split('/'); - const currentPageRouteParts = currentPageRoute.split('/'); +export const checkTabBarActive = (linkUrl, currentPageRoute, tabBarList, packageEntryTab) => { + const adaptedLinkUrl = adaptSubpackageUrl(linkUrl); + const adaptedCurrentRoute = adaptSubpackageUrl(currentPageRoute); - // console.log('diy-bottom-nav verify:', { linkUrlParts, currentPageRouteParts}); + // 去除查询参数,仅比较路径部分 + const cleanLinkUrl = adaptedLinkUrl.split('?')[0]; + const cleanCurrentRoute = adaptedCurrentRoute.split('?')[0]; - try { - // 二级页面 - if (linkUrlParts[2] === currentPageRouteParts[2]) { - return true; - } + const linkUrlParts = cleanLinkUrl.split('/'); + const currentPageRouteParts = cleanCurrentRoute.split('/'); - // 一级页面,限定只能是goods相关 - if (linkUrlParts[1] === currentPageRouteParts[1] && linkUrlParts[1] === 'pages_goods') { - return true; - } - } catch (error) { - console.error('diy-bottom-nav verify error:', error); + // 首先尝试精确匹配(整个路径匹配) + if (cleanLinkUrl === cleanCurrentRoute) { + return true; } - return false; + // 如果没有精确匹配,且传入了 tabBarList,使用动态判断逻辑 + if (tabBarList && tabBarList.list && Array.isArray(tabBarList.list)) { + // 获取所有 tab 项的链接(去除查询参数) + const tabUrls = tabBarList.list + .filter(item => item.link && item.link.wap_url) + .map(item => adaptSubpackageUrl(item.link.wap_url).split('?')[0]); + + // 检查当前 linkUrl 是否是合法的 tab URL + if (!tabUrls.includes(cleanLinkUrl)) { + return false; + } + + // 获取当前页面所属的分包名(parts[1]) + const currentPackageName = currentPageRouteParts[1]; + const linkPackageName = linkUrlParts[1]; + + // 如果 linkUrl 和当前页面不在同一个分包,直接返回 false + if (linkPackageName !== currentPackageName) { + return false; + } + + // 获取当前页面路径的二级目录(parts[2]) + const currentPageSecondPart = currentPageRouteParts[2]; + + // 检查当前页面路径是否匹配某个 tab 的精确路径 + const currentMatchingTab = tabUrls.find(url => { + if (!url) return false; + const parts = url.split('/'); + return parts[2] === currentPageSecondPart; + }); + + // 如果当前页面能精确匹配到某个 tab,那么只有该 tab 高亮 + if (currentMatchingTab) { + return cleanLinkUrl === currentMatchingTab; + } + + // 当前页面不是任何 tab 的精确匹配(是子页面) + // 使用 packageEntryTab 来确定应该高亮的 tab + if (packageEntryTab && typeof packageEntryTab === 'object') { + const entryTab = packageEntryTab[currentPackageName]; + if (entryTab) { + const entryTabParts = entryTab.split('/'); + return linkUrlParts[2] === entryTabParts[2]; + } + } + + // 基于二级路径匹配(fallback) + try { + if (linkUrlParts[2] === currentPageSecondPart) { + return true; + } + } catch (error) { + console.error('diy-bottom-nav verify error:', error); + } + + return false; + } } export default { diff --git a/components-diy/diy-bottom-nav.vue b/components-diy/diy-bottom-nav.vue index ba8864b..b64b82e 100644 --- a/components-diy/diy-bottom-nav.vue +++ b/components-diy/diy-bottom-nav.vue @@ -59,7 +59,7 @@