44 lines
1.9 KiB
TypeScript
44 lines
1.9 KiB
TypeScript
// 自定义 tabBar 实例获取:只有 tab 页自身才有 getTabBar(),
|
||
// 通知页等非 tab 页调用会拿到 undefined,需从页面栈中查找仍在栈内的 tab 页。
|
||
|
||
export function getTabBarInstance(): any {
|
||
const pages = typeof getCurrentPages === 'function' ? getCurrentPages() : []
|
||
for (let i = pages.length - 1; i >= 0; i--) {
|
||
const page = pages[i] as any
|
||
const tabBar = page && page.getTabBar && page.getTabBar()
|
||
if (tabBar) return tabBar
|
||
}
|
||
return null
|
||
}
|
||
|
||
// 同步未读红点:优先让 tabBar 重新拉取真实数量,取不到实例时静默跳过
|
||
export function syncTabBarUnread(force = true): void {
|
||
const tabBar = getTabBarInstance()
|
||
if (tabBar && typeof tabBar.syncUnread === 'function') tabBar.syncUnread(force)
|
||
}
|
||
|
||
// 用已知数量直接更新红点:不发请求,供页面拉到最新未读数后同步 tabBar
|
||
export function setTabBarUnread(count: number): void {
|
||
const tabBar = getTabBarInstance()
|
||
if (tabBar && typeof tabBar.setUnread === 'function') tabBar.setUnread(count)
|
||
}
|
||
|
||
// 更新选中态:走 tabBar 的 setSelected(内部保证首帧安全),
|
||
// 老版本实例没有该方法时降级为 setData
|
||
export function setTabBarSelected(index: number): void {
|
||
const tabBar = getTabBarInstance()
|
||
if (!tabBar) return
|
||
if (typeof tabBar.setSelected === 'function') tabBar.setSelected(index)
|
||
else tabBar.setData({ selected: index })
|
||
}
|
||
|
||
// 弹层遮罩期间隐藏悬浮标签栏:tabBar 由框架渲染在页面容器之上,
|
||
// 页面内任何 z-index 都盖不住它,只能让组件自身淡出(内部同样走首帧安全更新)。
|
||
// 弹层关闭后必须恢复,页面 onShow 时可再校准一次,避免残留隐藏。
|
||
export function setTabBarHidden(hidden: boolean): void {
|
||
const tabBar = getTabBarInstance()
|
||
if (!tabBar) return
|
||
if (typeof tabBar.setHidden === 'function') tabBar.setHidden(hidden)
|
||
else tabBar.setData({ hidden })
|
||
}
|