微信小程序根据权限动态生成对应权限的tab-bar

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

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

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

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

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

  attached() {
    let that = this
    that.setData({
      list: app.globalData.tabList
    })
    getApp().watch(that.watchBack.bind(that)) // 监听并回调
  },
  methods: {
    watchBack(list) {
       this.setData({
        list: list
      })
    },
    switchTab(e) {
      const data = e.currentTarget.dataset;
      const url = data.path;
      console.log(data, this.data.list);
      console.log(e.currentTarget.dataset.index);
      wx.switchTab({
        url:url
      })
    }
  }

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

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

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

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

// app.js中使用Object.defineProperty监听 自定义watch函数
watch:function (method) {
    var obj = this.globalData;
    var temp = obj.tabList;
    Object.defineProperty(obj,"tabList", {
      configurable: true,
      enumerable: true,
      set: (value) => {
        temp = value
        method(value); // 这里回调传值
      },
      get:function(){。
        return temp
      }
    })
  },

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

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

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

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

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

或者这样去设置

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

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

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

onShow(){
       this.getTabBar().setData({

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

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值