uni-app ios原生下拉刷新(circle)与swiper组件存在冲突

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

uni-app ios原生下拉刷新(circle)与swiper组件存在冲突

信息类别 详细信息
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 win11
HBuilderX类型 正式
HBuilderX版本号 4.26
手机系统 iOS
手机系统版本号 iOS 17
手机厂商 苹果
手机机型 ipone12
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX
App下载地址或H5网址 https://apps.apple.com/cn/app/%E9%98%91%E7%8F%8A%E5%A4%84/id6479599905

操作步骤:

pages.json开启:
"app-plus": {
"pullToRefresh": {
"support": true,
"style": "circle",
"offset": "50px"
}
}

然后页面里使用swiper,在ios手机上测试

预期结果:

流畅

实际结果:

被下拉刷新阻塞

bug描述:

ios中,当页面开启原生下拉刷新时,页面有swiper,你左右滑动swiper,及其容易导致swiper卡着不动,这个bug让我一顿好找,真离大谱了,痛苦死我了  

我上传的压缩包是视频,可以看看滑动是什么样子的,也可以appstore搜索“阑珊处”,点击一个笔记,进去感受

Image

WeChat_20240907104547.zip


8 回复

你好,我这边用swiper + pullToRefresh 下拉刷新配置,没有复现问题。 你这边提供一下可复现的demo工程。


使用你提交的包,在HbuilderX 4.32-alpha,是能复现的

回复 8***@qq.com: 不只是HbuilderX 4.32-alpha,我用的HbuilderX 4.29也有这个问题

你们能复现啥问题啊。我4.36也碰到此问题。

我也出现这个问题了,更新完4.28版本之后重新打基座就出现这个问题了

有解决吗?

来个人管管呗,两个多月过去了问题还在,体验很差啊

在uni-app中,当使用iOS原生下拉刷新(circle)与swiper组件时,确实可能会遇到冲突问题。这种冲突通常表现为下拉刷新后swiper组件的行为异常,比如无法正确滑动或内容显示不正确。以下是一个示例代码,展示了如何结合使用这两个组件,并通过一些技巧来解决潜在的冲突。

首先,确保你的uni-app项目已经配置好了iOS原生下拉刷新。这通常是在pages.json中配置页面的extra属性,例如:

{
  "pages": [
    {
      "path": "pages/index/index",
      "style": {
        "navigationBarTitleText": "首页",
        "enablePullDownRefresh": true,
        "extra": {
          "ios": {
            "pullRefresh": {
              "support": true,
              "indicator": "circle"
            }
          }
        }
      }
    }
  ]
}

接下来,在你的页面中使用swiper组件。为了避免冲突,你可以在页面加载完成和下拉刷新完成后重新初始化swiper。以下是一个简单的示例:

<template>
  <view>
    <swiper
      ref="mySwiper"
      :autoplay="false"
      :interval="3000"
      :duration="500"
      circular
      indicator-dots
    >
      <swiper-item v-for="(item, index) in items" :key="index">
        <view>{{ item }}</view>
      </swiper-item>
    </swiper>
  </view>
</template>

<script>
export default {
  data() {
    return {
      items: ['Slide 1', 'Slide 2', 'Slide 3']
    };
  },
  onLoad() {
    this.initSwiper();
  },
  onPullDownRefresh() {
    // 模拟数据刷新
    setTimeout(() => {
      this.items = ['New Slide 1', 'New Slide 2', 'New Slide 3'];
      uni.stopPullDownRefresh();
      this.$nextTick(() => {
        this.initSwiper();
      });
    }, 1000);
  },
  methods: {
    initSwiper() {
      // 使用uni-app的$refs获取swiper实例并重新初始化
      this.$refs.mySwiper.swiper.init();
    }
  }
};
</script>

注意,this.$refs.mySwiper.swiper.init();这一行是关键,它尝试在swiper组件上调用init方法来重新初始化swiper。然而,需要注意的是,uni-app的swiper组件可能并不直接暴露init方法,这里的调用是一个示意,实际中可能需要通过其他方式(如重新渲染swiper组件)来确保swiper在下拉刷新后能够正常工作。

此外,由于uni-app和原生组件的交互可能受到平台限制,建议在实际开发中详细测试不同平台和版本的表现,并根据需要进行调整。

回到顶部