uni-app 微信小程序tabBar角标或徽标badge不生效 但Android安卓却显示正常

问题描述

今天复习项目时又遇到了一个奇怪的问题:
使用uni-app写tabBar的中购物车右上角的角标时,从商品详情页点击添加到购物车后,商品详情右上角的角标数字会跟随Vuex仓库中的商品总数发生变化,但是主页面也就是tabBar页面中的购物车角标不会变化,或者只有第一次添加会变化,并且这个功能我已经通过混入mixin封装好了,在显示tabBar页面中都已引入。并且离谱的是安卓模拟器上这个效果却正常,并且第一次写该项目时也没遇到这个问题。

问题截图:

1.初始数据购物车数据截图:
在这里插入图片描述
2.点击加入购物车后左下角数量发生变化,控制台也打印了仓库中的总数信息:
在这里插入图片描述
3.点击"购物车"按钮,tabBar页面的购物车角标第一次修改显示正常
在这里插入图片描述

4.重新进入商品详情页,添加商品到购物车,可以看到左下角购物车角标显示正常为76,小程序控制台也同步打印出了Vuex对应的商品总数

在这里插入图片描述
5.问题点来了,重新回到tabBar页面的购物车右上角的角标仍然是第一次修改的61,多次尝试编译重新运行,重新打开Hbuilder都无效,并且使用安卓模拟器这个功能确实是正常的,这里为了节省篇幅就不截了。
在这里插入图片描述
在混入mixins的中控制tabBar的角标源代码如下:

//封装一个混入混入模块,相当于公共函数
import {mapState} from 'vuex' 
export default {
  computed:{
    ...mapState('m_cart',['totalCartNums'])
  },
  onLoad() {
    this.mySetTabBarBadge()
  },
  methods:{
    mySetTabBarBadge(){
      if(this.totalCartNums <=0 ){
        console.log("<1");
        uni.removeTabBarBadge({
          index:2
        })
      }else if(this.totalCartNums >=100){
        console.log(">99");
        uni.setTabBarBadge({
          index:2,
          text: '99+'
        })
      }else{
        console.log("1-99");
        uni.setTabBarBadge({
          index:2,
          text: this.totalCartNums.toString()
      })
    }
  }
},
  watch:{
    "totalCartNums":function(newVal){
      this.mySetTabBarBadge()
    }
  }
}

tabBar badge显示异常原因分析:

1.在混入里我使用了uni-app自带的uni.setTabBarBadge方法去修改tabBar页面的角标,并在我自定义的mySetTabBarBadge方法根据Vuex中商品总数去分情况展示tabBarBadge的显示样式。

2.为了防止tabBar页面的tabBarBadge不会响应式展示,我使用了watch监听器,一旦Vuex中totalCartNums发生了变化,就调用我自定义的mySetTabBarBadge方法去动态修改角标展示情况。

3.以目前的水平来看逻辑是没有问题的,但是就是出现了角标没有实时更新的情况,非常无奈。

4.后面在翻阅了不少博客后,原文链接如下:uni.setTabBarBadge 在非 tabbar 页面上更新无效问题,并且结合微信开放平台社区中一位网友的回答我解决了该问题,连接如下:wx.setTabBarBadge 在没有tabbar的页面设置了不生效
简而言之,就是在我本身逻辑没有大的问题外,uni自带的setTabBarBadge方法在非tabBar页面不会自动更新。也就是说当我从非主包的页面,修改影响tabBarBadge展示的值后,调用uni.setTabBarBadge方法是不起作用的。

解决办法

既然非tabBar页面调用uni.setTabBarBadge方法无效,那么我们就在会展示tabBar页面的角标所有页面的onShow方法去调用,也就是修改混入里的onLoad方法为onShow方法

PS:onShow方法在小程序中就是页面一旦展示就会加载运行里面的代码块,这样不管我在什么界面,只要修改了影响tabBarBadge的值,再回到tabBar页面后,都会重新加载onShow方法,调用uni.setTabBarBadge去修改角标的展示,而在tabBar页面调用这个方法是不会出现异常的。

修改后的混入源码如下:

//封装一个混入混入模块,相当于公共函数
import {mapState} from 'vuex' 
export default {
  computed:{
    ...mapState('m_cart',['totalCartNums'])
  },
  //主要就是修改了这里,将onLoad方法修改为了onShow方法
  onShow() {
    this.mySetTabBarBadge()
  },
  methods:{
    mySetTabBarBadge(){
      if(this.totalCartNums <=0 ){
        console.log("<1");
        uni.removeTabBarBadge({
          index:2
        })
      }else if(this.totalCartNums >=100){
        console.log(">99");
        uni.setTabBarBadge({
          index:2,
          text: '99+'
        })
      }else{
        console.log("1-99");
        uni.setTabBarBadge({
          index:2,
          text: this.totalCartNums.toString()
      })
    }
  }
},
  watch:{
    "totalCartNums":function(newVal){
      this.mySetTabBarBadge()
    }
  }
}

运行截图就不再放了,就是商品详情页的购物车角标和tabBar页面的购物车角标会同步展示,符合预期情况。

另外,在第一次写该项目时,应该选的是默认的Vue3模板,在非tabBar页面调用uni.setTabBarBadge方法时,会报错误:Unhandled promise rejection {errMsg: “setTabBarBadge:fail not TabBar page”}。而本次选的Vue2模板,就没有这个错误提示,不过只要在混入里将设置角标的方法都写到onShow方法体中,页面渲染暂时是没问题的。

总结

在使用uni-app的setTabBarBadge方法修改角标时,如果非tabBar页面也会修改影响角标展示的值,那么应该在封装的展示角标的混入里,使用onShow生命周期函数去重新调用一次uni.setTabBarBadge,以避免不同tabBar页面和非tabBar页面切换时角标展示异常的问题。

  • 32
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uni-app 是一个基于 Vue.js 的多端开发框架,可以同时开发小程序、H5、App等多个平台,其中微信小程序uni-app 最为常见的使用场景之一。在微信小程序中,底部的 tabbar 是一个非常常见的组件,通常用于快速导航和页面切换。当应用需要根据用户的不同角色动态改变底部 tabbar 显示内容时,需要进行以下步骤: 1.定义多个 tabbar 页面 针对不同角色定义对应的 tabbar 页面,每个 tabbar 页面的内容和顺序可以根据角色进行不同的定义。比如对于普通用户和管理员,底部的 tabbar 在内容和样式上都有所不同。可以在页面的根目录下创建多个 tabbar 页面,并对其进行对应的设计和排版。 2.使用 $refs 获取当前 tabbar 组件 在每个 tabbar 页面中,通过 $refs 获取到当前的 tabbar 组件,可以访问其全部属性和方法。 3.使用条件渲染控制 tabbar 显示 通过条件渲染的方式控制不同的 tabbar 页面按照不同的条件进行显示。比如可以根据当前登录的用户角色,决定显示普通用户还是管理员的 tabbar 页面。在 onLoad 函数中对当前用户角色进行判断,并设置对应的 tabbar 页面。 4.tabbar 组件事件绑定 当用户点击 tabbar 中的某个页面时,可以通过事件监听器捕捉到点击事件,并进行相应的页面跳转或其他操作。 总之,根据角色动态更改底部 tabbar 可以提高用户的使用体验和页面访问效率。切换 tabbar 页面也是一个常见的界面操作。通过以上的方式来实现,在 uni-app 微信小程序中更加容易地实现这一操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值