小程序的onPageScroll函数防抖与函数节流

场景

函数防抖和节流都能优化 js 的性能,在开发的过程中由于要监听页面滚动的高度,但是每次屏幕的滑动,距离顶部有变化就会执行一次方法;这会导致性能的下降,简单来说用户体验极差;

解决方法

把两个方法封装到公用的tool.js

/*函数节流*/
function throttle(fn, interval) {
   
   
  var enterTime = 0;//触发的时间
  var gapTime = interval || 300 ;//间隔时间,如果interval不传,则默认300ms
  return function() {
   
   
    var context = this;
    var backTime = 
微信小程序中,官方支持的交互行为主要包括下拉刷新(`onPullDownRefresh`)和上拉触底(`onReachBottom`),而向上滑动触顶并不是原生支持的功能。然而,可以通过监听滚动事件并结合自定义逻辑来实现类似“触顶刷新”的效果。 ### 实现思路 1. **监听页面滚动** 微信小程序提供了 `onPageScroll` 生命周期函数,可以用来监听页面的滚动事件。通过获取当前滚动条的位置,判断是否已经接近顶部位置(例如 `scrollTop <= 0` 或某个较小的阈值),从而触发刷新操作。 2. **手动调用刷新方法** 当检测到用户滑动至顶部时,可以调用一个自定义的刷新方法(如 `refreshData`),用于重新加载数据或重置分页参数。 3. **避免频繁触发** 为了防止用户快速滑动时多次触发刷新,可以在代码中加入防抖机制或者状态标识,确保刷新逻辑只在特定条件下执行。 ### 示例代码 以下是一个完整的实现示例: ```javascript Page({ data: { scrollTop: 0, // 滚动条当前位置 isRefreshing: false, // 是否正在刷新 dataList: [], // 数据列表 currentPage: 1, pageSize: 10 }, onLoad() { this.loadData(); }, // 加载数据 async loadData(page = 1) { if (this.data.isRefreshing) return; this.setData({ isRefreshing: true }); try { const newData = await this.fetchDataFromServer(page); this.setData({ dataList: page === 1 ? newData : [...this.data.dataList, ...newData], currentPage: page, isRefreshing: false }); } catch (error) { console.error("数据加载失败", error); this.setData({ isRefreshing: false }); } }, // 模拟网络请求 fetchDataFromServer(page) { return new Promise((resolve) => { setTimeout(() => { const newData = Array.from({ length: 5 }, (_, i) => ({ id: (page - 1) * 5 + i + 1, text: `数据项 ${(page - 1) * 5 + i + 1}` })); resolve(newData); }, 800); }); }, // 页面滚动事件 onPageScroll(e) { const scrollTop = e.detail.scrollTop; this.setData({ scrollTop }); if (scrollTop <= 0 && !this.data.isRefreshing) { this.refreshData(); } }, // 刷新数据 refreshData() { this.setData({ currentPage: 1 }); this.loadData(1); }, // 上拉加载更多 onReachBottom() { const nextPage = this.data.currentPage + 1; this.loadData(nextPage); } }); ``` ### WXML 结构示例 ```html <view class="container" bindscroll="onPageScroll"> <view wx:for="{{dataList}}" wx:key="id" class="item">{{item.text}}</view> </view> ``` ### WXSS 样式建议(可选) ```css .container { height: 100%; overflow-y: scroll; } .item { padding: 20rpx; border-bottom: 1rpx solid #eee; } ``` ### 注意事项 - 微信小程序默认不支持“触顶”事件,因此需要依赖 `onPageScroll` 来监听滚动行为。 - 在实际开发中,应考虑性能优化,比如使用节流函数控制滚动事件频率。 - 若页面内容较少,无法触发滚动条,则 `onPageScroll` 不会被调用,此时需根据业务需求进行特殊处理[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值