为了解决小程序tabbar闪烁的问题,我将小程序重构成了 SPA

(日落西山,每次看到此景,我总是会想到明朝(明朝那些事儿第六部的标题,日落西山))

前言

几个月前,因工作需求,我开发了一个小程序,当时遇到了一个需求,是关于tabbar权限的问题。小程序的用户分两种,普通用户和vip用户,普通用户tabbar有两个,vip用户小程序下面的tabbar有五个。

因为涉及自定义tabbar的问题,所以官方自带的tabbar肯定就不能用了,我们需要自定义tabbar。官方也提供了自定义tabbar的功能。

官网自定义tabbar

官网地址:基础能力 / 自定义 tabBar (qq.com)

js 复制代码
{
  "tabBar": {
    "custom": true,
    "list": []
  }
}

就是需要在 app.json 中的 tabBar 项指定 custom 字段,需要注意的是 list 字段也需要存在。

然后,在代码根目录下添加入口文件:

bash 复制代码
custom-tab-bar/index.js
custom-tab-bar/index.json
custom-tab-bar/index.wxml
custom-tab-bar/index.wxss

具体代码,大家可以参考官网案例。

需要注意的是每个tabbar页面 / 组件都需要在onshow / show 函数中执行以下函数,否则就会出现tabbar按钮切换两次,才会变成选中色的问题。

js 复制代码
      if (typeof this.getTabBar === 'function' &&
        this.getTabBar()) {
        this.getTabBar().setData({
          selected: 0     // 第n个tabbar页面就填 n-1
        })
      }

接下来就是我的思路

我在 custom-tab-bar/index.js 中定义了一个函数,这个函数去判断当前登录人是否为vip,如果是就替换掉tabbar 的数据。

那么之前每个页面的代码就要写成这样

js 复制代码
      if (typeof this.getTabBar === 'function' &&
        this.getTabBar()) {
        this.getTabBar().change_tabbar_list()
        this.getTabBar().setData({
          selected: 0   // 第n个tabbar页面就填 n-1
        })
      }

ok,我们来看一下效果。注意看视频下方的tabbar,每个页面,第一次点击的时候,有明显的闪烁bug。(大家也可以参考一下市面上的小程序,小部分的小程序有这个闪烁问题,大部分的小程序没有这个闪烁的问题(如:携程小程序))

bug产生原因

那么我们就要去思考了,为什么人家的小程序没有这个bug呢?

想这个问题前,要先去想这个bug是怎么产生的,我猜测是每个tabbar页面都有个初始化的过程,第一次渲染页面的时候要去重新渲染tabbar,每个页面的tabbar都是从0开始渲染,然后会缓存到每个页面上,所以第二次点击就没有这个bug了。

解决tabbar闪烁问题

为了解决这个问题,我想到了SPA ,也就是只留一个页面,其他的tabbar页面都弄成组件。

效果展示

已经解决,tabbar闪烁的问题。

代码思路,通过wx:if 控制组件的显示隐藏。

源码地址:gitlab.com/wechat-mini...

https克隆地址:gitlab.com/wechat-mini...

写在最后

1、我也是在网上见过别人的一些评论,说如果将小程序重构成这种单页面,会有卡顿问题,我目前没有发现这个问题,可能是我做的小程序功能比较少。

2、至于生命周期,将页面切换成组件后,页面的那些生命周期也肯定都不能使用了,只能用组件的生命周期,我之前开发使用组件的生命周期实现业务逻辑也没什么问题。 触底加载这些也只能换成组件去实现了。

3、小程序最上面的标题,也可以使用以下代码来实现。就是在每个组件初始化的时候要去执行下列代码。

js 复制代码
            wx.setNavigationBarTitle({
                title: '',
              });
相关推荐
Highcharts.js1 小时前
Highcharts React v5升级三问|最大的升级方向是什么?需要注意什么?有什么优化?
前端·javascript·react.js·前端框架·highcharts·大数据渲染·前端性能
skilllite作者8 小时前
SkillLite Channel 与 Gateway 配置完全指南:Webhook、环境变量与桌面助手
ide·后端·前端框架
silvia_Anne9 小时前
微信小程序(组件通讯和全局数据共享)
微信小程序·小程序
i220818 Faiz Ul9 小时前
个人健康系统|健康管理|基于java+Android+微信小程序的个人健康系统设计与实现(源码+数据库+文档)
android·java·vue.js·spring boot·微信小程序·毕设·个人健康系统
云起SAAS1 天前
企业名片画册相册微信小程序源码 | 管理后台+后端 | 含产品展示资讯视频
微信小程序·广告联盟·企业名片画册相册微信小程序源码
px不是xp1 天前
Docker部署Qdrant向量数据库,初始化向量数据库,重构RAG逻辑
数据库·docker·微信小程序·重构·qdrant
px不是xp1 天前
【灶台导航】 RAG系统的容错设计:从向量搜索到关键词降级,一个都不能少
javascript·微信小程序·notepad++·rag
阿里巴啦1 天前
微信小程序实战:基于原生框架 + 云开发实现 干饭足迹小程序,美食打卡、地图探索与消费报告
微信小程序·小程序开发·微信云开发·云函数·小程序项目实战·美食打卡记录
三声三视1 天前
Electron鸿蒙桌面应用打包部署完全指南(含自动更新)
前端·electron·前端框架·harmonyos·鸿蒙·桌面端
px不是xp1 天前
【灶台导航】烹饪导航页:步骤、定时器与语音播报
前端·javascript·微信小程序·云函数