在uni-app Vue3中,setTabBarBadge:fail not tabbar page错误表示当前页面不是TabBar页面,因此无法设置TabBar徽章。以下是解决方案:
1. 检查页面配置
确保当前页面在pages.json的tabBar配置中:
{
  "tabBar": {
    "list": [
      {
        "pagePath": "pages/index/index",
        "text": "首页"
      },
      {
        "pagePath": "pages/user/user",
        "text": "我的"
      }
    ]
  }
}
2. 在TabBar页面调用方法
仅在TabBar页面中使用uni.setTabBarBadge:
// 正确:在 pages/index/index.vue(TabBar页面)中调用
onLoad() {
  uni.setTabBarBadge({
    index: 0, // TabBar索引
    text: '1'
  })
}
3. 使用全局状态管理(跨页面通信)
若非TabBar页面需更新徽章,通过Vuex/Pinia传递状态:
// store中定义状态
const store = new Vuex.Store({
  state: { badgeCount: 0 },
  mutations: {
    setBadge(state, count) {
      state.badgeCount = count
    }
  }
})
// 非TabBar页面触发
methods: {
  updateBadge() {
    this.$store.commit('setBadge', 5)
  }
}
// TabBar页面监听并更新
computed: {
  badgeCount() {
    return this.$store.state.badgeCount
  }
},
watch: {
  badgeCount(newVal) {
    uni.setTabBarBadge({
      index: 1,
      text: String(newVal)
    })
  }
}
4. 使用事件总线(简单场景)
// eventBus.js
import mitt from 'mitt'
export default mitt()
// 非TabBar页面发送事件
import eventBus from './eventBus'
eventBus.emit('update-badge', { index: 0, text: 'New' })
// TabBar页面监听事件
onLoad() {
  eventBus.on('update-badge', (data) => {
    uni.setTabBarBadge(data)
  })
}
总结
- 直接调用:仅在TabBar页面使用uni.setTabBarBadge
- 间接更新:通过状态管理或事件通信,由TabBar页面执行实际操作
- 检查索引:确保index参数与tabBar.list中的顺序一致
确保代码执行时页面已初始化,可在onReady或onShow生命周期中调用。