4***@qq.com
4***@qq.com
  • 发布:2024-05-06 13:43
  • 更新:2024-05-06 20:37
  • 阅读:113

微信小程序在 2.5.0版本(2019年)就支持自定义tabbar了,uniapp现在整不出一个原生支持的版本?

分类:uni-app

https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html

我查了其他大佬实现的方案

都是用 uni.hidetabbar 绕开的方案

https://uniapp.dcloud.net.cn/api/ui/tabbar.html#hidetabbar

丑陋,太丑陋了

2024-05-06 13:43 负责人:无 分享
已邀请:
7***@qq.com

7***@qq.com

直接按照小程序那边的自定义tabbar的写法不满足你的要求吗

  • 4***@qq.com (作者)

    能用,但是很奇怪

    2024-05-06 16:27

4***@qq.com

4***@qq.com (作者)

根据官方文档实现了下
https://uniapp.dcloud.net.cn/collocation/pages.html#custom-tab-bar

微信小程序官方给的示例移植到uniapp需要做些修改

跟原生 tabbar 相比,自定义的 tabbar 是每个页面(page)单独的

在初次切换时,由于第一次渲染,会造成闪动

而且每个页面的 tabbar 数据都是独立的,需要代码上做特殊处理:

  1. App.vue 定义 globalData,用于各个页面的 tabbar 全局访问:
<script>  
    export default {  
        onLaunch: function() {  
            console.log('App Launch')  
        },  
        onShow: function() {  
            console.log('App Show')  
        },  
        onHide: function() {  
            console.log('App Hide')  
        },  
        globalData: {  
            CustomTabIndex: 0  
        }  
    }  
</script>  

<style>  
</style>
  1. /custom-tab-bar/index.js 里使用 globalData 来动态更新每个页面的 tabbar 的 selected 值:
var app = getApp()  

Component({  
    data: {  
        selected: 0,  
        color: "#888888",  
        selectedColor: "#000000",  
        list: [{  
                pagePath: "/pages/index/index1",  
                text: "页面1"  
            },  
            {  
                pagePath: "/pages/index/index2",  
                text: "页面2"  
            },  
            {  
                pagePath: "/pages/index/index3",  
                text: "页面3"  
            }  
        ]  
    },  

    attached() {  
        this.setData({  
            selected: app.globalData.CustomTabIndex  
        })  
    },  

    methods: {  
        switchTab(e) {  
            const data = e.currentTarget.dataset  
            const url = data.path  
            wx.switchTab({  
                url  
            })  
            app.globalData.CustomTabIndex = data.index  
        }  
    }  
})
  • 7***@qq.com

    我记得这一部分按照微信那边的文档写比较好,可以直接复制文档的

    2024-05-09 16:42

  • 4***@qq.com (作者)

    回复 7***@qq.com: 他那个每个页面都要在 onLoad 做绑定的,我这个不用。在 uniapp 里用更好。

    2024-05-10 10:54

4***@qq.com

4***@qq.com (作者)

还有一个比较简单粗暴的实现方式

把小程序实现为一个 “单页应用”

然后置底的 tabbar 只需要配合 v-show 来显示各个页面内的组件就好了

  • 困难总比办法多

    太麻烦了 你直接隐藏官方的tabbar,自定义一个底部栏,这样你切换页面的时候还能用到他原生tabbar页面的缓存

    2024-05-07 10:50

  • 4***@qq.com (作者)

    回复 困难总比办法多: 是个好办法,但是这样的话,每个页面还是得渲染一个自定义的底部栏吧?应该还是会有闪烁的问题

    2024-05-07 15:12

  • 困难总比办法多

    回复 4***@qq.com: 模拟器会有闪烁 真机不会

    2024-05-07 15:14

  • 4***@qq.com (作者)

    回复 困难总比办法多: 我试了你的方法,有个问题是第一次加载首页会有个隐藏官方 tabbar 造成的闪烁

    2024-05-07 22:31

  • 困难总比办法多

    回复 4***@qq.com: 我是在组件的onMounted(() => {uni.hideTabBar();});去隐藏,不是页面

    2024-05-08 09:15

  • 4***@qq.com (作者)

    回复 困难总比办法多: 你这样还是无法避免有隐藏这个动作,顺便确认下你是微信小程序平台么?

    2024-05-08 10:03

要回复问题请先登录注册