uni-app onPageScroll()滚动监听 在特定条件下初次加载失效bug
uni-app onPageScroll()滚动监听 在特定条件下初次加载失效bug
产品分类:
uniapp/H5
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | win11 | HBuilderX |
操作步骤:
<template>
<userHomePage></userHomePage>
</template>
<script setup>
import { onPageScroll } from '@dcloudio/uni-app'
//滚动监听
onPageScroll(() => {
console.log('onPageScroll');
})
</script>
预期结果:
预期结果为:初次加载tabBar页面模板中的component组件,onPageScroll()能够直接生效。
实际结果:
初次打开tabBar页面,component组件内容渲染出来,但是该component组件页面的onPageScroll()滚动监听是失效的,需要切换到其他任意页面再回来,onPageScroll()才能够生效
另外有一个点: 把onPageScroll()写在component组件中,然后再通过tabBar页面引入组件,就可以复现这个bug。 奇怪的是通过uni.navigateTo()跳转到这个component组件是可以直接触发onPageScroll()的。。很奇怪
!!!目前发现一个暂时的解决方案,tabBar页面中添加一个空的onPageScroll(),就能够触发嵌套的component的onPageScroll()。。。
bug描述:
tabBar页面模板中插入component组件,并在该组件内部设置onPageScroll()滚动监听, 初次打开tabBar页面,component组件内容渲染出来,但是该页面的onPageScroll()滚动监听是失效的, 此时切换到其他任意页面再回到tabBar页面,component组件的onPageScroll()滚动监听才会生效。 请官方复现一下。
还是大佬的这个临时方案有效,官方到现在还是没有回复这个bug啊
目前发现一个暂时的解决方案,tabBar页面中添加一个空的onPageScroll(),就能够触发嵌套的component的onPageScroll()。。。 这条亲测有效,解决了我的问题…
一直有这个问题,组件中引用生命周期不生效,需要在引用组件的页面也引用一下相同的生命周期函数,不光onPageScroll(),其它的生命周期也一样,你可以试试
针对您提到的 uni-app
中 onPageScroll()
方法在特定条件下初次加载失效的问题,这通常与页面的生命周期管理、事件绑定时机或组件状态初始化有关。以下是一个示例代码案例,展示如何在 uni-app
中正确设置和使用 onPageScroll()
方法,以确保其在页面初次加载时能够正常监听滚动事件。
示例代码
1. 页面结构(pages/index/index.vue
)
<template>
<view class="container">
<scroll-view scroll-y="true" @scroll="handleScroll">
<view class="content" :style="{ height: contentHeight + 'px' }">
<!-- 模拟长内容 -->
<view v-for="i in 100" :key="i" class="item">Item {{ i }}</view>
</view>
</scroll-view>
</view>
</template>
<script>
export default {
data() {
return {
contentHeight: 1500, // 模拟内容高度
isScrollEnabled: true // 控制滚动监听是否启用
};
},
mounted() {
// 在mounted生命周期中启用滚动监听
this.enableScrollListener();
},
methods: {
enableScrollListener() {
if (this.isScrollEnabled) {
this.$mp.page.onPageScroll(this.handleScroll);
}
},
handleScroll(e) {
console.log('Scroll position:', e.scrollTop);
// 在这里处理滚动事件,比如根据滚动位置调整某些UI元素
}
},
beforeDestroy() {
// 在页面销毁前移除滚动监听
if (this.isScrollEnabled) {
this.$mp.page.offPageScroll(this.handleScroll);
}
}
};
</script>
<style>
.container {
height: 100vh;
overflow: hidden;
}
.content {
padding: 20px;
}
.item {
height: 50px;
line-height: 50px;
border-bottom: 1px solid #ccc;
text-align: center;
}
</style>
说明
- 生命周期管理:在
mounted
钩子中启用滚动监听,确保 DOM 已经渲染完毕。 - 事件绑定:使用
this.$mp.page.onPageScroll()
绑定滚动事件,这是uni-app
提供的原生页面滚动监听方法。 - 移除监听:在
beforeDestroy
钩子中移除滚动监听,避免内存泄漏。 - 条件控制:通过
isScrollEnabled
变量控制是否启用滚动监听,方便在特定条件下禁用或启用。
通过上述方法,可以有效避免 onPageScroll()
在初次加载时失效的问题。如果问题仍然存在,请检查是否有其他代码或组件影响了滚动事件的正常触发。