uni.showTabBarRedDot需在tabBar就绪后调用,推荐onShow中加150ms延迟;仅App和小程序支持,H5不支持;红点与数字角标独立,需手动维护状态并避免连续快速调用。
原生 tabbar 的红点只能用 uni.showtabbarreddot 和 uni.hidetabbarreddot 控制,不能靠 css 或自定义组件模拟——否则在真机上会失效,且 ios/android 表现不一致。
为什么 uni.showTabBarRedDot 调了没反应
不是 API 写错了,而是它依赖原生 tabBar 已就绪。常见失效场景:
- 在
onLoad或created里调用:tabbar 组件还没挂载,调了等于没调 - 页面是通过
uni.navigateTo进入的二级页(不在tabBar.list中):index 找不到对应项,直接静默失败 - 传了错误的
index:必须严格匹配pages.json中tabBar.list的数组下标(从 0 开始),数错一个就白忙 - H5 端完全不支持:该 API 仅在 App(iOS/Android)和微信、支付宝等小程序平台有效
uni.showTabBarRedDot 必须搭配 onShow + 延迟
真机上最稳的写法是:
onShow() {
setTimeout(() => {
uni.showTabBarRedDot({ index: 2 })
}, 150)
}
原因很实际:tabbar 渲染有延迟,尤其在冷启动或页面切换后。150ms 是多数机型验证过的安全阈值;太短(如 50ms)iOS 容易漏掉,太长(如 500ms)用户会感知卡顿。
- Vue 3 +
onActivated更合适:配合keep-alive页面,比onShow触发更准 - 避免重复调用:同一
index连续show多次,iOS 可能闪烁或残留;建议加个标记位,只在状态变更时触发 - 清空红点必须用
uni.hideTabBarRedDot:别指望uni.removeTabBarBadge或改文字来“覆盖”,它们互不干扰
红点和数字角标不能混用逻辑
很多人以为设了数字角标后红点就自动消失,其实不是:
-
uni.showTabBarRedDot({ index: 1 })和uni.setTabBarBadge({ index: 1, text: '3' })是两个独立状态 - 先 show 红点,再 setBadge,多数安卓机会优先显示 badge、自动隐藏红点;但反过来,removeBadge 后红点不会自动出现
- 想“有未读就红点,有数字就角标”,得自己维护状态:比如用全局 store 记录
hasUnreadRedDot和badgeCount,再分别调用对应 API - 连续操作间隔至少 50ms,否则 iOS 会出现视觉残留
真正麻烦的不是怎么调 API,而是每次改完都得拿三台真机(iOS、华为、小米)测一遍位置偏移和触发时机——开发者工具里的红点永远是对齐的,现实里它可能在 iPhone 上偏右 2px,在 EMUI 上贴着图标边缘。这没法绕开,只能接受。


















