当前位置:   article > 正文

微信小程序根据权限动态生成对应权限的tab-bar_微信小程序 tabbar根据权限 tab选中问题

微信小程序 tabbar根据权限 tab选中问题

关于配置自定义tab-bar的方法可以参考微信官方文档

如题:最近公司在做微信小程序,遇到了不同权限用户有不同权限的需求,简单的自定义tab-bar已无法满足需要了。自己在网上搜了很多关于动态渲染对应tab-bar的案例,有的可以实现显示对应权限tab-bar,但是切换点击就会有选中样式闪烁和不对应的问题。找了很久才找到,也非常感谢那位大佬教程,让自己也有思路和想法,非常感谢哇!

废话不说了,直接上代码吧

在登录成功的时候把权限标识存入app.js的全局数据(globalData)中,方便其他界面和组件读取,提前在app.js的globalData中定义好对应权限的tabbar数组。

在custom-tab-bar(自定义组件)组件中赋值给对应的list

  1. attached() {
  2. let that = this
  3. that.setData({
  4. list: app.globalData.tabList
  5. })
  6. getApp().watch(that.watchBack.bind(that)) // 监听并回调
  7. },
  8. methods: {
  9. watchBack(list) {
  10. this.setData({
  11. list: list
  12. })
  13. },
  14. switchTab(e) {
  15. const data = e.currentTarget.dataset;
  16. const url = data.path;
  17. console.log(data, this.data.list);
  18. console.log(e.currentTarget.dataset.index);
  19. wx.switchTab({
  20. url:url
  21. })
  22. }
  23. }

请注意:这里很容易出问题: 默认是a权限,而登录拥有b权限的后,tabbar还是原来默认权限a,而不是切换后的tabbar,所以app.global DATa.tabList还是默认值,因此要对全局的globalData的tabList数据进行监听才行。

注意:在监听的时候 getapp().watch(that.watchBack.bind(that))需要注意

  1. // 如果是getApp().watch(that.watchBack)
  2. // 那么在watchBack回调函数中执行this.setData 这个this指向的是undefined,因此需要改变this指向!
  3. getApp().watch(that.watchBack.bind(that))
  4. // 这里试验用call和apply无法改变this,原因后面来讲

在app.js中定义好watch监听方法

  1. // app.js中使用Object.defineProperty监听 自定义watch函数
  2. watch:function (method) {
  3. var obj = this.globalData;
  4. var temp = obj.tabList;
  5. Object.defineProperty(obj,"tabList", {
  6. configurable: true,
  7. enumerable: true,
  8. set: (value) => {
  9. temp = value
  10. method(value); // 这里回调传值
  11. },
  12. get:function(){。
  13. return temp
  14. }
  15. })
  16. },

这里就可以正常获取到tabList的值并且赋值,这里夹杂着Object.defineProperty,我搞的也不太清晰,反正正大改搞懂。所以说写代码思路真的很重要~~~~

经过实际操作后测试发现这种方式有个很坑的问题,ios在加载tab-bar的时候,如果初始化时默认值为两个tab,动态生成三个,ios会采用初始化的值,应该是用的缓存中的初始值,后续赋值就无效。

改进:
将赋值放到页面上操作,不在组件或者app.js中操作tabList的值。

可以在index组件(首页)onSHow方法中去判断,只需要在首页中设置一次就可以了,不用每个tabbar界面去设置

  1. onShow() {
  2. //app.globalData.tabList2 为新值 ,app.globalData.tabList为初始化的值,判断后根据实际情况赋值。
  3. this.getTabBar().setData({
  4. list: app.globalData.tabList2,
  5. })
  6. }

或者这样去设置

  1. if(app.globalData.role==0){
  2. this.getTabBar().setData({
  3. list:app.globalData.tabList1,//这是权限1的tabbar
  4. })
  5. }else{
  6. this.getTabBar().setData({
  7. list:app.globalData.tabList2,//这是权限2的tabbar
  8. })
  9. }

到这里会发现可以在登录后去动态更新tabbar了,是不是很神奇。先别急着开心,你会发现切换的时候发现选中的icon和样式没有切换过来,解决问题可以这样来:

在对应的界面去设置选中,这里如index(首页)的onShow方法中

  1. onShow(){
  2. this.getTabBar().setData({
  3. selectedindex:0 //注意 tabbar界面从 0 1 2 3 ... 在每个对应组件onShow中设置对应的选中数组
  4. })
  5. }

这样就搞定了权限动态调整tabbar的需求了。

参考连接:微信小程序动态设置tab-bar解决自定义tabBar选中时的状态变换:通过 getTabBar 接口获取组件实例

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/89978
推荐阅读