微信小程序--组件 下拉加载下一页(scroll-view 并防止抖动)

.wxml

javascript 复制代码
 <scroll-view class="body-container" scroll-top="{{scrollTop}}"  scroll-y="true" bindscrolltolower="bindDownLoad" bindscrolltoupper="topLoad" bindscroll="scroll">
  <view class="content-view">
      <view  wx:for="{{newsList}}" wx:key="newsId">
        {{item.name}}
      </view>
    </view>
    <view class="loading-view">
      <view hidden="{{!loading}}">
        加载中<div class="dot"></div>
        <div class="dot"></div>
        <div class="dot"></div>
      </view>
      <view hidden="{{!loadingComplete}}">
        已加载全部
      </view>
    </view>
  </scroll-view>

.js

javascript 复制代码
// homePage/index/index.js
const httpUtils = require("../../utils/httpUtils")
const app = getApp()
var total = 0
var pageNo = 1
const pageSize = 20
Component({
  /**
   * 组件的属性列表
   */
  properties: {},

  lifetimes: {
    created: function () {
    },
    attached: function () {
      setTimeout(() => {
        this.getListHome('fresh')
      }, 0)
    },
    ready: function () {}
  },

  /**
   * 组件的初始数据
   */
  data: {
    timer: null,
    scrollTop: 0,
    loading: false,
    loadingComplete: false,
    newsList: [],
  },

  /**
   * 组件的方法列表
   */
  methods: {
    //下拉加载
    bindDownLoad: function () {
      this.loadData()
    },
    scroll: function (event) {
      if (this.timer) {
        clearTimeout(this.timer)
      }
      //定时器在滚动加载时防止抖动
      this.timer = setTimeout(() => {
        this.setData({
          scrollTop: event.detail.scrollTop,
        });
      }, 2000);
      this.setData({
        isFixed: event.detail.scrollTop >= 150 ? true : false
      });
      if (event.detail.scrollTop >= 600) {
        this.setTouchShow(true)
      } else {
        this.setTouchShow(false)
      }
    },
    //上拉刷新
    topLoad: function () {
      //数据刷新
      this.resetData()
    },
    joinEnterprise() {
      wx.showToast({
        title: '功能暂未开放',
        icon: 'error'
      })
    },
    //页面出现时调用
    resetData() {
      pageNo = 1
      total = 0
      pageNo = 1
      this.getListHome('fresh')
    },
    loadData(action) {
      if (action == 'fresh') {
        pageNo = 1
      }
      if (action == 'more') {
        if (pageNo * pageSize < total) {
          pageNo++
          this.getListHome('more')
        }
      } else {
        this.getListHome('fresh')
      }
    },
    getListHome(type) {
      let url = ""
      this.setData({
        loading: true,
      })
      httpUtils.post({
        url: url,
        data: {
          page: pageNo,
          pageSize: pageSize,
        }
      }).then(res => {
        // wx.hideLoading()

        total = res.total;
        this.setData({
          loading: false,
          loadingComplete: pageNo * pageSize <= total ? false : true,
        })
        let newsList = res.records||[]
        if (type == 'fresh') {
          this.setData({
            newsList: newsList
          })
        } else {
          this.setData({
            newsList: this.data.newsList.concat(newsList)
          })
        }
        this.setData({
          noData: this.data.newsList.length ? false : true
        })
      }).finally(err => {
        this.setData({
          loading: false,
          loadingComplete: pageNo * pageSize <= total ? false : true,
        })
        this.setData({
          noData: this.data.newsList.length ? false : true
        })
      })
    },

    //回到顶部,内部调用系统API
    goTopOn() {
      this.setData({
        scrollTop: 0
      })
      if (wx.pageScrollTo) {
        wx.pageScrollTo({
          scrollTop: 0
        })
      } else {
        wx.showModal({
          title: '提示',
          content: '当前微信版本过低,暂无法使用该功能,请升级后重试。'
        })
      }
    },

    setTouchShow(touchShow) {
      this.setData({
        touchShow
      })
    },
  }
})

.wxss

javascript 复制代码
.body-container {
  margin-top: 400rpx;
  display: flex;
  flex-direction: column;
  border-top-left-radius: 40rpx;
  border-top-right-radius: 40rpx;
  z-index: 9;
  position: sticky;
  width: 100vw;
  height: 66vh;
}
.loading-view {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  height: 100rpx;
  margin-top: 20rpx;
  font-size: 32rpx;
}

@keyframes blink {
  0% {
    opacity: 0;
  }

  50% {
    opacity: 1;
  }

  100% {
    opacity: 0;
  }
}

.dot {
  display: inline-block;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: #333;
  margin: 0 5px;
  animation: blink 1.4s infinite both;
}

.dot:nth-child(2) {
  animation-delay: 0.7s;
}

.dot:nth-child(3) {
  animation-delay: 1.4s;
}

底部loading动画

javascript 复制代码
<view hidden="{{!loading}}">
  加载中<div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
</view>    

@keyframes blink {
  0% {
    opacity: 0;
  }

  50% {
    opacity: 1;
  }

  100% {
    opacity: 0;
  }
}

.dot {
  display: inline-block;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: #333;
  margin: 0 5px;
  animation: blink 1.4s infinite both;
}

.dot:nth-child(2) {
  animation-delay: 0.7s;
}

.dot:nth-child(3) {
  animation-delay: 1.4s;
}
相关推荐
2501_9159090616 小时前
iOS 应用反调试技详解术 检测调试器的原理与防护实践
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张19 小时前
iOS加固技术路线全面解析:Bitcode模式、源码模式与汇编模式对比及爱加密优势
android·汇编·ios·小程序·uni-app·cocoa·iphone
海纳百川·纳海川19 小时前
租房行业数字化:换个思路解决“老问题”
大数据·微信小程序·小程序
上海云盾-小余1 天前
CC 高频请求 + DDoS 流量攻击实战防御:全链路 WAF 流量清洗部署完整流程
网络·爬虫·安全·小程序·ddos
2501_916008891 天前
iOS IPA文件反编译与打包操作方法,拆包分析防护和加固打包
android·macos·ios·小程序·uni-app·cocoa·iphone
2301_810313181 天前
海外教育APP定制发展现状与开发选型核心要点解析
小程序·团队开发·软件需求
2501_915921432 天前
iOS手游安全反外挂解决方案:基于Xcode的加固混淆特色详解
android·安全·ios·小程序·uni-app·iphone·xcode
禾高网络2 天前
回收小程序在环保和商业领域发挥更大的作用
java·大数据·人工智能·小程序
2501_916007472 天前
iOS App分发教程 App Store、TestFlight 与 Ad Hoc 的配置与上传方法
android·ios·小程序·https·uni-app·iphone·webview
JasonMa1532 天前
从零搭建一个微信小程序活动管理平台(一):架构设计与技术选型
javascript·微信小程序·node.js