uni-app scroll-view下拉refresherrefresh在安卓机中下拉一次就会触发三次事件

发布于 1周前 作者 gougou168 来自 Uni-App

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 状态变量来防止重复触发。只有当 refreshingfalse 时,才开始新的刷新操作。
  • 异步操作:确保刷新操作是异步的,并在操作完成后更新 refreshing 状态。
  • 滚动事件@scrolltolower 事件可以用来处理滚动到底部的逻辑,比如加载更多数据,但确保不要与 refresher 的刷新逻辑冲突。

通过上述方法,你应该能够避免在安卓设备上 scroll-viewrefresher 功能下拉一次触发多次刷新事件的问题。如果问题依旧存在,建议检查是否有其他滚动事件或手势识别干扰了 refresher 的正常工作。

回到顶部