uni-app实现 上拉加载更多 添加节流阀避免多次请求

废话不多说,直接上代码

1:在项目根目录page.json配置文件,当前的页面上配置上拉触底的距离

{
         "path": "goods_list/goods_list",
         "style": {
           "onReachBottomDistance": 150
         }
       },

2:data中自定义数据

data() {
  return {
  //请求参数对象
  queryObj: {
      // 查询关键词
      query: '',
      // 商品分类Id
      cid: '',
      // 页码值
      pagenum: 1,
      // 每页显示多少条数据
      pagesize: 10,
   },
   //商品列表数据
   goodsList: [],
   //总数量,用来实现分页
   total: 0,
   //节流阀
   isLoading: false
   };
},

3:onLoad初始化数据

    onLoad(options) {
      console.log(options)
      this.queryObj.query = options.query || ''
      this.queryObj.cid = options.cid || ''

      this.getGoodsList()
    },

4:methods放请求方法

   methods: {
      async getGoodsList() {
        //开启节流阀
        this.isLoading = true      
        const { data: res } = await uni.$http.get('*******', this.queryObj)
        if (res.meta.status !== 200) {
          return uni.$showMsg()
        }
        console.log(res)
        //请求完成,关闭节流阀
        this.isLoading = false        
        // 为数据赋值
        //上拉加載更多,,定义一个新数组,将旧数组展开,再将旧数组展开
        this.goodsList = [...this.goodsList , ...res.message.goods] 
        this.total = res.message.total             
      }
    },

5:与methods方法平级,放置onReachBottom方法,实现下拉加载更多

    onReachBottom() {
       //如果下面的公式成立,则证明没有下一页数据了
       //当前的页码值 * 每页显示多少条数据 >= 总数条数
       //pagenum * pagesize >= total

      //判断数据是否加载完毕,依赖服务端返回总条数字段,如果服务端没返回,可以去除这段代码
      if(this.queryObj.pagenum * this.queryObj.pagesize >= this.total){
        return uni.$showMsg('数据加载完毕')
      }


      //下拉加载更多,判断是否正在请求其他数据
      if(this.isLoading) return  
      //頁碼值自增+1
      this.queryObj.pagenum += 1
      // 重新获取列表数据
      this.getGoodsList()
    }

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uni-app中,上拉加载更多是一种见的交互方式,用于在列表或页面中加载更多的数据。下面是一种实现上拉加载更多的方法: 1. 首先,在你的页面或组件中,需要监听页面滚动事件,以便判断用户是否已经滚动到了页面底部。 2. 当用户滚动到页面底部时,触发一个加载更多的函数。 3. 在加载更多的函数中,可以发送异步请求获取更多的数据。 4. 获取到数据后,将新数据追加到原有的数据列表中。 5. 更新页面的数据绑定,使页面能够展示新加载的数据。 下面是一个示例代码: ```html <template> <view> <!-- 列表展示数据 --> <view v-for="(item, index) in dataList" :key="index">{{ item }}</view> <!-- 加载更多提示 --> <view v-if="loading">加载中...</view> </view> </template> <script> export default { data() { return { dataList: [], // 存储数据列表 loading: false, // 是否正在加载更多 page: 1, // 当前页码 pageSize: 10, // 每页数据数量 }; }, mounted() { // 监听页面滚动事件 uni.pageScrollTo({ scrollTop: 0, duration: 0, }); uni.onPageScroll(this.handlePageScroll); }, destroyed() { // 取消监听页面滚动事件 uni.offPageScroll(this.handlePageScroll); }, methods: { handlePageScroll(e) { // 判断是否滚动到页面底部 const { scrollTop, scrollHeight, windowHeight } = e; if (scrollTop + windowHeight >= scrollHeight) { this.loadMore(); } }, loadMore() { // 正在加载中,避免重复触发 if (this.loading) return; this.loading = true; // 发送异步请求获取更多数据 uni.request({ url: 'your-api-url', data: { page: this.page, pageSize: this.pageSize, }, success: (res) => { // 获取到新数据 const newData = res.data; // 将新数据追加到原有数据列表中 this.dataList = this.dataList.concat(newData); // 更新页码 this.page++; // 加载完成,重置loading状态 this.loading = false; }, fail: (err) => { console.error(err); // 加载失败,重置loading状态 this.loading = false; }, }); }, }, }; </script> ``` 这是一个简单的示例,你可以根据自己的实际需求进行修改和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值