赞
踩
关于配置自定义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 接口获取组件实例
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。