必须用uni.removeTabBarBadge或uni.hideTabBarRedDot显式清除角标,不可动态隐藏;需按平台差异配对使用API,并在业务状态为0时主动调用清除方法,避免残留。

不能直接“动态隐藏角标”,必须用对应 API 显式清除 —— uni.removeTabBarBadge 或 uni.hideTabBarRedDot 才是正确操作,调用时机和平台差异才是关键。
uni.removeTabBarBadge 和 uni.hideTabBarRedDot 必须配对使用
显示红点用 uni.showTabBarRedDot,显示数字用 uni.setTabBarBadge,但它们没有“自动消失”机制。所谓“动态隐藏”,本质是业务逻辑触发后主动调用清除 API:
-
uni.removeTabBarBadge({ index: 2 }):移除数字角标(注意不是hide,是remove) -
uni.hideTabBarRedDot({ index: 2 }):隐藏红点(不能用remove,否则报错) - 两者不能混用:对已设红点的 tab 调
removeTabBarBadge无效;对已设数字的 tab 调hideTabBarRedDot也无效
常见错误:在 onShow 里反复 set 又不 remove,导致角标残留
比如“我的”页每次 onShow 都查未读数,有就 setTabBarBadge,但没读数时忘了 remove —— 角标会一直挂着。正确做法是:
- 先判断业务状态:未读数为 0?还是 null/undefined?
- 为 0 时,必须显式调
uni.removeTabBarBadge({ index: 4 }) - 不要依赖“不调用就不显示”,原生角标一旦渲染,不会因 JS 未再调用而自动消失
- 示例片段:
onShow() { const unread = this.unreadCount || 0 if (unread > 0) { uni.setTabBarBadge({ index: 4, text: String(unread) }) } else { uni.removeTabBarBadge({ index: 4 }) // 这行不能省 } }
安卓/iOS/小程序平台行为不一致,别信“开发者工具表现”
同一段代码,在微信小程序真机上可能立即生效,iOS App 上却延迟半秒或偏位,支付宝则可能压根不显示红点文字。这是因为:
-
uni.setTabBarBadge的text参数在 iOS 上强制截断为最多 3 位数字,超长显示为 "99+";安卓部分机型不支持非数字字符 - 红点位置:微信小程序红点居中,iOS 原生 tabBar 红点默认偏右,无法通过 CSS 调整
- 最稳方案:只在必要平台(如微信、App)启用角标,H5 和百度小程序可降级为 badge 文字内嵌在自定义 tab 组件里
自定义 TabBar 时,原生角标仍可能闪现
即使你在 pages.json 中配置了 "tabBar": {"custom": true},iOS 和部分安卓厂商机仍会在页面切换瞬间渲染原生 tabBar 并带上旧角标。解决方法只有两个:
- 在
app.vue的onLaunch和onShow中都执行uni.hideTabBar({ animation: false }),压制原生层 - 所有角标操作(
set/remove)改用自定义组件内部状态控制,完全绕过原生 API - 特别注意:
uni.getTabBar()在开启custom: true后返回undefined,别在自定义 tab 里尝试调它
真正难的不是写几行 API 调用,而是把“角标该不该显示”这个业务判断,和“哪个平台能显示/怎么显示才不崩”这个平台适配,拆解成可维护的状态分支 —— 很多项目后期角标乱飞,根源都在这里漏了一层平台守卫或状态兜底。


















