uni-app 上拉页面触发loadmore时,若没有更多数据,loading固定显示在屏幕最底部不随页面滚动,内容部分上拉无法回弹,被顶部元素遮住

uni-app 上拉页面触发loadmore时,若没有更多数据,loading固定显示在屏幕最底部不随页面滚动,内容部分上拉无法回弹,被顶部元素遮住

开发环境 版本号 项目创建方式
Mac 14.3.1 HBuilderX

示例代码:

<list ref="wflist" :show-scrollbar="false" class="page-productlist-waterfall " loadmoreoffset="600" @loadmore="loadmore" style="{height:mainH}">
    <refresh @refresh="onrefresh" @pullingdown="onpullingdown" :display="refreshing ? 'show' : 'hide'">
        <text class="pullingdown--loading"></text>
        <loading-indicator></loading-indicator>
    </refresh>
    <cell>内容部分</cell>
    <loading>
        <uni-load-more :status="loadingType"></uni-load-more>
    </loading>
</list>

操作步骤:

  • 上拉页面触发loadmore,没有更多数据时,loading 固定显示在屏幕最底部,不会随页面滚动,内容部分上拉无法回弹

预期结果:

  • loading区块应该跟随页面内容,随页面滚动;页面应该正常回弹

实际结果:

  • 上拉页面触发loadmore,没有更多数据时,loading 固定显示在屏幕最底部,不会随页面滚动,内容部分上拉无法回弹

bug描述:

  • list或者waterfall中添加 <loading></loading> 时,当上拉触发加载更多到最后一页(没有更多数据时),<loading></loading> 区块会固定显示在页面最底部,不会随页面滚动,同时添加的 下拉刷新也会失效,无法下拉刷新,导致页面顶部部分区域上拉上去之后,无法下来,被顶部元素遮住;

更多关于uni-app 上拉页面触发loadmore时,若没有更多数据,loading固定显示在屏幕最底部不随页面滚动,内容部分上拉无法回弹,被顶部元素遮住的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 上拉页面触发loadmore时,若没有更多数据,loading固定显示在屏幕最底部不随页面滚动,内容部分上拉无法回弹,被顶部元素遮住的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中,当你在上拉加载更多数据时,如果没有更多数据,通常需要处理 loading 状态的显示以及页面的滚动行为。你描述的问题可能是由于 loading 状态的处理不当或页面的布局问题导致的。以下是一些可能的解决方案:

1. 使用 uni-load-more 组件

uni-app 提供了 uni-load-more 组件,可以方便地处理上拉加载更多的状态。你可以根据是否有更多数据来显示不同的状态。

<template>
  <view>
    <scroll-view
      scroll-y="true"
      @scrolltolower="loadMore"
      style="height: 100vh;"
    >
      <!-- 页面内容 -->
      <view v-for="item in list" :key="item.id">{{ item.text }}</view>

      <!-- 加载更多组件 -->
      <uni-load-more :status="loadingStatus"></uni-load-more>
    </scroll-view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      list: [], // 数据列表
      loadingStatus: 'more', // 加载状态,可选值:more, loading, noMore
      page: 1, // 当前页码
      totalPages: 5 // 总页数
    };
  },
  methods: {
    loadMore() {
      if (this.page >= this.totalPages) {
        this.loadingStatus = 'noMore'; // 没有更多数据
        return;
      }

      this.loadingStatus = 'loading'; // 加载中

      // 模拟异步加载数据
      setTimeout(() => {
        this.page++;
        this.list.push(...this.getNewData()); // 添加新数据
        this.loadingStatus = 'more'; // 恢复加载更多状态
      }, 1000);
    },
    getNewData() {
      // 模拟生成新数据
      return Array.from({ length: 10 }, (_, i) => ({
        id: this.list.length + i + 1,
        text: `Item ${this.list.length + i + 1}`
      }));
    }
  }
};
</script>

2. 处理 loading 状态和页面滚动

如果 loading 状态显示在屏幕底部且不随页面滚动,可能是因为 loading 组件没有正确放置在 scroll-view 内部,或者 scroll-view 的高度设置不正确。

确保 loading 组件是 scroll-view 的子元素,并且 scroll-view 的高度设置为 100vh 或其他适当的值,以确保内容可以正常滚动。

3. 处理内容被顶部元素遮住的问题

如果内容部分上拉时被顶部元素遮住,可能是因为顶部元素的 position 设置为了 fixedabsolute,导致内容无法正常滚动到顶部。

你可以通过调整顶部元素的样式或使用 padding-top 来避免内容被遮住。

<template>
  <view>
    <view class="header">顶部元素</view>
    <scroll-view
      scroll-y="true"
      @scrolltolower="loadMore"
      style="height: calc(100vh - 50px);"
    >
      <!-- 页面内容 -->
      <view v-for="item in list" :key="item.id">{{ item.text }}</view>

      <!-- 加载更多组件 -->
      <uni-load-more :status="loadingStatus"></uni-load-more>
    </scroll-view>
  </view>
</template>

<style>
.header {
  height: 50px;
  background-color: #f0f0f0;
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 10;
}
</style>

4. 使用 page 样式

如果你使用的是 uni-apppage 样式,确保 page 样式没有设置 overflow: hidden,这可能会导致页面内容无法正常滚动。

page {
  overflow: auto;
}
回到顶部