uni-app实现下拉加载,上拉刷新

一、上拉加载与下拉刷新的核心区别

1.触发方式与交互目标
  1. 下拉刷新

    • 触发动作‌:用户在页面顶部向下滑动一定距离后触发‌。
    • 目标‌:‌重新加载最新数据‌(如新消息、动态更新),覆盖原有数据‌。
    • 交互设计‌:通常伴随动画提示(如“刷新中...”),完成后恢复原位‌。
  2. 上拉加载

    • 触发动作‌:用户在页面底部向上滑动至触底区域时触发‌。
    • 目标‌:‌加载更多历史数据‌(如分页列表的下一页数据),追加到现有列表‌。
    • 交互设计‌:底部显示加载提示(如“加载中...”或“没有更多数据”)‌
2、.数据操作逻辑
功能 数据操作 参数变化
下拉刷新 清空旧数据,重新加载第一页数据‌ page=1,重置页码‌
上拉加载 保留旧数据,追加下一页数据‌ page++,递增页码

 在 Uni-App 中实现 下拉刷新(下拉加载)和 上拉加载更多(上拉刷新)可以通过原生 API 和页面配置轻松实现。以下是具体实现步骤和代码示例:

二、下拉刷新(下拉加载)

1. 配置页面支持下拉刷新

在 manifest.json 的页面配置中,开启下拉刷新功能:

{
  "pages": [
    {
      "path": "pages/index/index",
      "style": {
        "enablePullDownRefresh": true // 开启下拉刷新
         "onReachBottomDistance": 100   触底距离(单位:px)
      }
    }
  ]
}

 2. 实现下拉刷新逻辑

在页面的 .vue 文件中,通过 onPullDownRefresh(整个页面的刷新 生命周期或事件监听实现:




 三、上拉加载更多(无限滚动)

1. 监听页面滚动到底部

可以通过 onReachBottom (整个页面的刷新)生命周期或自定义滚动容器(如 scroll-view)监听滚动事件。

方法 1:使用 onReachBottom(简单场景)



四、使用 scroll-view(区域滚动,不会触发页面滚动 自定义滚动(复杂场景)

当页面内容需要嵌套滚动时,使用 scroll-view 组件监听滚动到底部:


<
  
  {{ item.title }}
  
  加载中...


methods: {
  onRefresh() {  // 下拉刷新
    this.isRefreshing = true;
    this.page = 1;
    this.getData(() => this.isRefreshing = false);
  },
  onLoadMore() {  // 上拉加载
    if (this.isLoading || this.isEnd) return;
    this.isLoading = true;
    this.page++;
    this.getData(() => this.isLoading = false);
  }
}

 五、第三方组件库方案(企业级需求)

1. ‌uView 组件

 uView 2.0 是一款功能强大的UI框架,专为UniApp开发设计,提供了丰富的组件和工具,帮助开发者提升开发效率和UI设计水平。

‌快速集成封装好的列表组件:

npm install uview-ui
或在 HBuilderX 插件市场搜索 uView UI 直接安装‌
//main.js

import uView from 'uview-ui'  
Vue.use(uView)  
//uni.scss
@import '@/uni_modules/uview-ui/theme.scss';  
//在 App.vue 的 

2. ‌mescroll-nui

‌引入插件实现高级滚动控制: 

import Mescroll from 'mescroll-nui';
export default {
  components: { Mescroll },
  mescroll: new Mescroll({
    down: { use: true },  // 启用下拉刷新
    up: { use: true }     // 启用上拉加载
  })
}

 六完整实现代码(基于 uni-app 原生事件方案)

1.pages.json 配置
{
  "path": "pages/list/list",
  "style": {
    "enablePullDownRefresh": true,  // 开启下拉刷新‌
    "onReachBottomDistance": 100     // 触底触发距离‌
  }
}
2.页面逻辑实现





3.核心逻辑说明
  1. 数据加载控制

    • 下拉刷新重置 page=1,清空旧数据‌
    • 上拉加载通过 page++ 实现分页‌
    • 通过 page*pageSize >= total 判断数据是否加载完毕‌
  2. 交互提示优化

    • 下拉时显示 refresh-tip 提示‌
    • 底部显示 loading/noMore 状态提示‌
  3. 强制停止刷新
    必须调用 uni.stopPullDownRefresh() 关闭动画‌

4.扩展建议
  • 接口防抖‌:在 onReachBottom 中添加防抖避免重复请求‌
  • 虚拟列表‌:超长列表建议使用 uni-virtual-list 组件优化性能‌
  • 错误处理‌:接口请求失败时重置 loadStatus 状态‌

七、基于 scroll-view 的完整实现方案(Vue3 组合式 API) 




核心要点

  • 必须设置固定高度(动态计算屏幕剩余高度)‌
  • refresher-enabled 需保持 true 以启用下拉‌

1.关键注意事项
  1. 高度动态计算

    • 需根据页面布局(如固定导航栏)调整 scrollHeight
    • 使用 uni.getSystemInfo 获取精确窗口高度‌
  2. 状态强制重置

    • 下拉刷新后必须执行 triggered.value = false,否则动画无法关闭‌
    • 网络请求失败时需回退 page 和重置状态‌
  3. 防抖处理

    • 在 handleLoadMore 中添加防抖避免重复触发‌
let timer = null
const handleLoadMore = () => {
  if (timer) clearTimeout(timer)
  timer = setTimeout(() => {
    // 加载逻辑
  }, 300)
}

你可能感兴趣的:(uni-app)