uni-app 编译成小程序后 下面tab页切换会把加载过的tab页面的onShow都执行一遍
uni-app 编译成小程序后 下面tab页切换会把加载过的tab页面的onShow都执行一遍
操作步骤:
…
预期结果:
切换tab页面只执行当前页的onShow
实际结果:
执行了所有加载过tab页的onShow
bug描述:
uni-app 编译成小程序后 下面tab页切换 会把加载过的tab页面的onShow都会执行一遍 仅出现再Android手机上 iOS是正常的。
信息类型 | 内容 |
---|---|
产品分类 | uniapp/小程序/微信 |
PC开发环境 | Windows |
PC操作系统版本 | windows11 |
第三方开发者工具版本 | 1.06.2407101 |
基础库版本 | 3.5.3 |
项目创建方式 | CLI |
CLI版本 | 2.9.6 |
你好,可以提供一个测试工程吗?看一下你是咋用的
我新创建了个空项目 发布到小程序上 android端还是有这个问题 我这边怎么给你提供测试工程呢?提到github吗?
回复 l***@126.com: 在下方评论区,可以上传一个zip
回复 l***@126.com: 点击那个上传附件
回复 DCloud_UNI_yuhe: 传上来了
回复 DCloud_UNI_yuhe: 这个问题修复了吗?
回复 DCloud_UNI_yuhe: 这个问题还有在关注吗?
回复 l***@126.com: 你好,我这里看着是只执行当前的tabbar页面,你给出的项目该如何操作才能复现?
回复 DCloud_UNI_yuhe: 来回多切换几次 切换之前清空下日志就能看到问题了。
我依次点击tabbar是只触发一次的
在uni-app中,当你将应用编译成小程序时,可能会遇到Tab页切换时,已经加载过的Tab页面会重新触发onShow
生命周期函数的问题。这通常是由于小程序的页面生命周期管理机制导致的。为了避免不必要的资源消耗和逻辑重复执行,我们可以通过一些方法优化这个行为。
以下是一个简单的代码示例,展示了如何在uni-app中管理Tab页的生命周期,以减少不必要的onShow
调用:
- 创建全局状态管理(如使用Vuex或简单的全局变量)来跟踪当前显示的Tab页。
// store.js (Vuex示例)
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
currentTab: 'home' // 默认显示的Tab页
},
mutations: {
setCurrentTab(state, tab) {
state.currentTab = tab;
}
}
});
- 在Tab页组件中,根据全局状态决定是否执行
onShow
逻辑。
<template>
<view>
<!-- 页面内容 -->
</view>
</template>
<script>
import { mapState, mapMutations } from 'vuex';
export default {
computed: {
...mapState(['currentTab']),
isCurrentTab() {
return this.$route.path.includes(this.currentTab); // 简单的路径匹配
}
},
methods: {
...mapMutations(['setCurrentTab']),
handleShow() {
if (this.isCurrentTab) {
// 仅在当前Tab页被显示时执行逻辑
console.log('This tab is shown:', this.$route.path);
// 其他初始化或更新逻辑
}
}
},
onShow() {
this.handleShow();
}
};
</script>
- 在Tab切换时更新全局状态。
你可以在Tab栏组件的点击事件中更新当前Tab的状态:
<template>
<view>
<button @click="switchToHome">Home</button>
<button @click="switchToProfile">Profile</button>
<!-- 其他Tab按钮 -->
</view>
</template>
<script>
import { mapMutations } from 'vuex';
export default {
methods: {
...mapMutations(['setCurrentTab']),
switchToHome() {
this.setCurrentTab('home');
uni.switchTab({ url: '/pages/home/home' });
},
switchToProfile() {
this.setCurrentTab('profile');
uni.switchTab({ url: '/pages/profile/profile' });
}
}
};
</script>
通过上述方法,你可以有效地控制哪些Tab页需要在onShow
时执行逻辑,从而避免不必要的重复执行。这种方法依赖于全局状态管理和路由路径的匹配,适用于大多数uni-app编译成小程序后的场景。