解决小程序自定义底部菜单切换闪动

本文介绍如何解决小程序自定义底部菜单在页面切换时出现的闪动问题,通过创建公共页面并使用组件方式避免底部菜单重新加载,提高用户体验。采用uni开发,实现全面屏安全高度适配,并提供自定义头部的适配方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决小程序自定义底部菜单切换闪动

下方代码中获取全面平来适配安全高度的可以转移到我的另一篇文章

安全高度适配

业务上可能会有一个需求使用自定义底部菜单相信会有很多人遇到过这个需求

但是自定义底部菜单会有一个问题,在点击切换页面的时候底部菜单会重新加载,导致页面闪动,比较影响用户的体验性;

我采用的解决办法是建立一个公共的页面,所有底部菜单的对应页面采用组件的方法,这样可以解决底部菜单切换时闪动的问题;

我用的是uni开发的代码上可能与原生小程序有所差异,整体思路其实是一样的

头部我用的是自定义的头部,适配了不同机型(可能会有偏差)

接下来开始吧

1.新建一个indexRouter.vue的页面

<template>
	<view style="position: relative;" :class="nowchos==1?'bg_index_top':''">
		<home ref='home' v-if="nowchos == 1"></home>
		<curriculum v-if="nowchos == 2"></curriculum>
		<business v-if="nowchos == 3"></business>
		<circle v-if="nowchos == 4"></circle>
		<mine ref='mine' v-if="nowchos == 5"></mine>
		<view class="bottomboxs">
			//底部组件
			<navbottom :nowchos='nowchos' @botomchos='botomchos'></navbottom>
		</view>
	</view>
</template>

<script>
	import navbottom from '@/components/navbottom.vue'//引入 底部菜单组件
	import home from './index/index.vue'// 引入 首页
	import business from './business.vue'// 同上 引入相关页面
	import circle from './circle.vue'// 同上 引入相关页面
	import mine from './mine.vue'// 同上 引入相关页面
	import curriculum from './curriculum.vue'// 同上 引入相关页面
	export default {
   
   
		components: {
   
   //在这里注册相应的组件
			home,
			business,
			circle,
			mine,
			curriculum,
			navbottom
		},
		data() {
   
   
			return {
   
   
				nowchos: 1, //当前选择了那个底部菜单
				navtit: '页面标题',
				full: false, //是否全面屏
				bigscroll: false, //是否固定头部
			}
		},
		watch: {
   
   
			nowchos(e) {
   
   
				console.log(e);//可以监听 底部菜单的切换
			}
		},
		onPullDownRefresh() {
   
   //监听页面刷新 可以实现刷新重新请求组件里的接口重新渲染
			if(this.nowchos == 1){
   
   
				this.$refs.home.getlis
### 微信小程序自定义 TabBar 切换页面闪烁解决方案 #### 一、原因分析 在微信小程序中,当使用自定义TabBar并进行页面切换时,可能会出现图片闪动现象。这主要是由于每次切换页面都会重新渲染整个TabBar组件,导致其中的图像资源被重新加载,从而引起视觉上的闪烁效果[^2]。 #### 二、具体实现方式 ##### 1. 使用缓存机制优化图片加载 为了防止因频繁请求网络而导致的图片重载问题,可以在本地存储常用图标的Base64编码形式或其他高效的缓存策略来减少不必要的HTTP请求次数: ```javascript // 在globalData.js文件里保存全局变量用于存放已下载过的base64字符串 App({ globalData: { iconCache:{} } }) ``` ##### 2. 调整生命周期函数逻辑 确保只在必要时刻才去刷新TabBar的状态,而不是每次都强制更新。比如可以通过监听`onShow()`事件,在目标页面显示之前主动通知Custom-Tab-Bar组件改变其内部状态而不必完全重建DOM结构: ```json { "pages":[...], "tabBar":{ ... }, "usingComponents": {}, "custom":true, "window":{} } ``` 注意:需保证app.json配置项中的`"custom"`属性设为`true`,以便启用自定义底部导航栏功能[^1]。 另外还需修改各个带有TabBar链接的目标页(`tabPage`)内的js代码如下所示: ```javascript Page({ onShow:function(){ const app=getApp(); this.setData({activeIndex:index}); // index代表当前所处位置编号 } }); ``` 此处通过setData()方法间接告知外部环境自身的最新激活索引值,进而使得Custom-Tab-Bar能够依据此信息同步调整样式表现而无需经历完整的销毁与创建过程[^3]。 ##### 3. 隐藏返回按钮处理 如果仍然存在轻微卡顿感,则考虑采用一种变通手段——即让实际发生跳转操作的是某个不可见的子级界面而非顶级路由本身。这样做的好处是可以利用原生回退手势完成表象上的“即时响应”,同时又不影响整体交互流畅度: ```html <!-- parent.wxml --> <navigator url="/pages/child/child?from=parent"> <!-- tabBar item content here --> </navigator> ``` ```css /* child.wxss */ page{display:none;} ``` 最后记得把子页面顶部默认存在的“<”号去掉即可达成目的[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值