uni-app scroll-view下拉refresherrefresh在安卓机中下拉一次就会触发三次事件
uni-app scroll-view下拉refresherrefresh在安卓机中下拉一次就会触发三次事件
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | 4.29 | CLI |
产品分类:uniapp/App
PC开发环境操作系统:Windows
手机系统:Android
手机系统版本号:Android 8.1
手机厂商:华为
手机机型:DUB-AL00
页面类型:vue
vue版本:vue3
打包方式:云端
CLI版本号:3.0.0-3080720230703001
操作步骤:
- 触摸屏幕下拉一下
预期结果:
- 像小程序端一样,console.log(‘页面下拉-scroll-view’, e)只打印一次
实际结果:
- 在安卓测试机中console.log(‘页面下拉-scroll-view’, e)打印了三次
bug描述:
<swiper
class="swiperList-wrapper"
:duration="100"
:current="currentTabSwiper"
[@change](/user/change)="handleChangeSwiper"
>
<swiper-item>
<scroll-view
class="swiperScroll-wrapper"
:scroll-y="true"
:refresher-enabled="true"
:refresher-triggered="refresherTriggered"
@scroll="handleScroll"
@refresherrefresh="handleRefresh"
@scrolltolower="handleScrolltolower"
>
// 数据
</scroll-view>
</swiper-item>
...
</swiper>
const handleRefresh = (e) => {
console.log('页面下拉-scroll-view', e)
refreshList()
}
const refreshList = async() => {
if (!refresherTriggered.value) {
refresherTriggered.value = true
}
loadRecommendData()
}
const loadRecommendData = async(type?: string) => {
const resp = await getRecommendApi(recommendSearchQuery.value)
if (resp.success) {
refresherTriggered.value = false
....
}
}
1 回复
在 uni-app
中使用 scroll-view
组件的 refresher
功能时,如果遇到在安卓设备上下拉一次触发多次刷新事件的问题,通常是由于事件处理不当或滚动事件冲突导致的。以下是一个简化的代码示例,展示了如何正确设置 scroll-view
组件的 refresher
属性,并处理刷新事件,以避免重复触发的问题。
首先,确保你的 uni-app
项目已经正确配置了相关依赖,并且使用的是支持 refresher
功能的版本。
代码示例
1. 页面模板(.vue 文件)
<template>
<view>
<scroll-view
scroll-y="true"
:scroll-with-animation="true"
:refresher="true"
@refresh="handleRefresh"
@scrolltolower="handleScrollToLower"
style="height: 100vh;"
>
<!-- 列表内容 -->
<view v-for="item in items" :key="item.id">
{{ item.name }}
</view>
<!-- 模拟更多内容 -->
<view v-for="n in 50" :key="n">占位内容</view>
</scroll-view>
</view>
</template>
2. 页面脚本(.vue 文件)
<script>
export default {
data() {
return {
items: Array.from({ length: 20 }, (_, i) => ({ id: i + 1, name: `Item ${i + 1}` })),
refreshing: false, // 控制刷新状态的变量
};
},
methods: {
handleRefresh() {
if (!this.refreshing) {
this.refreshing = true;
// 模拟异步刷新操作
setTimeout(() => {
// 刷新数据
this.items = Array.from({ length: 20 }, (_, i) => ({ id: i + 1, name: `Updated Item ${i + 1}` }));
this.refreshing = false;
}, 2000);
}
},
handleScrollToLower() {
// 可以在这里处理滚动到底部的逻辑,比如加载更多数据
},
},
};
</script>
注意事项
- 防止重复触发:通过在
handleRefresh
方法中使用refreshing
状态变量来防止重复触发。只有当refreshing
为false
时,才开始新的刷新操作。 - 异步操作:确保刷新操作是异步的,并在操作完成后更新
refreshing
状态。 - 滚动事件:
@scrolltolower
事件可以用来处理滚动到底部的逻辑,比如加载更多数据,但确保不要与refresher
的刷新逻辑冲突。
通过上述方法,你应该能够避免在安卓设备上 scroll-view
的 refresher
功能下拉一次触发多次刷新事件的问题。如果问题依旧存在,建议检查是否有其他滚动事件或手势识别干扰了 refresher
的正常工作。