黑的发白头像
关注

uinapp小程序自定义底部tabbar闪动白屏去除

大家好,我小白,最近有朋友群里说这个小程序自定义底部tab初次点击会白屏问我能不能解决,实际上这个问题困扰大家好几年了,一直无所谓毕竟也没啥影响哈哈。。。网上检索方案无非就是两种。

①使用原生tabbar

②tabbar为主页,其他的页面作为组件存在(页面非常复杂,管理起来麻烦,性能差)

这都不是咱们的想要的结果。。。。

首先说下底部自定义tabbar为什么会闪屏晃动白屏?

因为自定义底部tabbar作为组件存在,每个页面初次点击都会重新加载渲染一遍组件,特别是有些比我还菜的小白,没做缓存优化,每个tabbar页面都还需从接口从新请求一遍tabbar数据,算上网络请求时间闪屏更严重了。

1️⃣那咱们解决的第一步就是,缓存优化。

uni.setStorageSync()和vuex都可以,只要首页加载过了,其他页面直接复用数据能极大程度减少闪屏晃动的时间,vuex基于内存效果更好,使vuex把自定义tabbar数据放在计算属性,基本上小程序和app几乎看不到闪屏了。h5有轻微闪动,不仔细听察觉不到。这样基本无感知了。。。

如果要实时更新最新图标样式,做好版本号管理即可。

那有没有办法彻底去除一丝丝轻微闪动?

有!有的老板!在后面细说!

2️⃣提升每个页面内tabbar组件渲染优先级

看着好像页面同时渲染的,实际上还是有细微差距的,尽管可能毫秒级别,咱们能提升一点是一点,template内元素或者组件同权重前提下,是从上至下渲染。
所以最好把tabbar组件放在模板内 顶部

全局变量定义前(最先执行)

全局变量定义后 初始值

export default 外部最后一行(早于生命周期)

data 执行(初始化数据)

onLoad 触发(页面加载,可修改数据)

onShow 触发(页面显示)

【computed】

计算属性首次求值(模板依赖的计算属性就绪,自定义tab组件的依赖数据也在此阶段完成求值)

↓ 【此时开始渲染流程】

↓ - 解析template模板(严格从上至下解析,自定义tab组件放在模板顶部会被优先解析)

↓ - 创建虚拟DOM(按模板解析顺序生成对应的虚拟节点树)

↓ - 挂载真实DOM到页面(虚拟DOM转化为真实DOM并插入页面文档流)

↓ - 视觉上能看到页面元素/内容(真实DOM渲染到视图层,用户可感知)

↓ 【渲染完成后】

mounted 触发(DOM已挂载完成,可操作DOM)

3️⃣自定义底部tab页面的路径要添加到原生底部tab内。

我们只是把原生的底部tab隐藏了而已,做了个自定义图标和样式底部tab,并且实现实时在线更新图标和样式罢了。实际上页面跳转也使用原生的页面跳转方式。

我发现有的应用,直接在普通非tabbar页面加个自定义定底部tab,每次点击都都触发从左往右的换页动画😂🤣😓这不瞎搞嘛。。。。

邪修大法,道友可以试试看。

①首先每个底部tab页内加载逻辑,让其初次进入不渲染页面内容,不执行接口逻辑,只渲染tab组件。vuex做好每个tab页是否为初次点击的状态标记。确保每个页面非初次进入,才执行接口请求和页面渲染。额外加一个简单判断而已,对性能无影响。(这步可选,适合追求完美的人体验更好,也可以省略)

②用户初次打开应用,App.vue中给他来个全屏加载动画,禁止他操作

③ App.vue中遍历点击所有tab页面

	async preloadAllTabs() {
		  uni.showLoading({
		    title: '正在加载...',
		    mask: true 
		  });
		
		  try {
		    const tabPaths = [
		      '/pages/index/index',
		      '/pages/goods_cate/goods_cate',
		      '/pages/order_addcart/order_addcart',
		      '/pages/user/index'
		    ];
		    
		    // 邪修替客户快速点击所有底部tab页面
		    for (const path of tabPaths) {
		      await new Promise(resolve => {
		        uni.switchTab({
		          url: path,
		          success: () => {
		            setTimeout(resolve, 50);
		          },
		          fail: (err) => {
		            console.warn(`预加载${path}失败:`, err);
		            resolve();
		          }
		        });
		      });
		    }
		    
		    // 返回首页
		    await new Promise(resolve => {
		      uni.switchTab({
		        url: '/pages/index/index',
		        success: resolve,
		        fail: resolve
		      });
		    });
		  } catch (err) {
		    console.error('tab预加载异常:', err);
		  } finally {
		    uni.hideLoading();
			console.log('点完收工!');
			//后续可选,使用vuex标记tab页是否初次加载
		  }
		},

至此邪功大成,已彻底去除自定义tab闪屏烦恼

追求完美的可以放在首页内触发,再自定义个更好看的加载动画。也就是最多耽误客户300ms时间提前帮客户点完所有页面,基本无感知的。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/u014686320/article/details/156296168

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--