详解性能更优越的小程序图片懒加载方式

以下是"详解性能更优越的小程序图片懒加载方式"的完整攻略:

懒加载方式的原理

懒加载是指在页面滚动时才去加载对应的图片,这样能够减少页面的加载时间,提升用户体验。在小程序中,懒加载的原理是通过监听页面滚动事件,判断图片是否在可视区域内,如果是,则去加载对应的图片。

基本实现方式

小程序里的图片组件是<image>,我们可以通过绑定<scroll-view>的滚动事件实现图片懒加载。具体实现如下:

首先,在<scroll-view>元素中绑定bindscrolltolower事件,表示到达滚动到底部时触发。

<scroll-view bindscrolltolower="loadMoreData">
<!-- 图片列表 -->
</scroll-view>

然后,实现loadMoreData事件,事件内判断图片是否在可视区域内,如果是,则将图片的src属性改为实际图片地址。

loadMoreData: function () {
  var that = this;
  // 获取可视区域的高度和宽度
  wx.createSelectorQuery().select('#scroll-view').boundingClientRect(function (res) {
    // 获取图片数组和当前已经加载的图片数量
    var imgs = that.data.imgs;
    var loadedCount = that.data.loadedCount;
    for (var i = loadedCount; i < imgs.length; i++) {
      // 如果图片在可视区域内,将图片的src改为实际的地址
      wx.createSelectorQuery().select('#img-' + i).boundingClientRect(function (rect) {
        if (rect.top < res.height) {
          imgs[i].src = imgs[i].realSrc;
        }
      }).exec();
    }
    // 更新已经加载的图片数量
    that.setData({
      loadedCount: i
    });
  }).exec();
}

优化方式

1. 图片数量限制

如果瀑布流或者列表中的图片过多,那么在滚动事件中大量计算图片的位置和状态,会对性能造成影响。因此可以设置一个图片数量的上限,这样就不会循环计算太多的图片,降低性能消耗。

wx.createSelectorQuery().selectViewport().scrollOffset(function (res) {
  var scrollTop = res.scrollTop;
  var screenHeight = wx.getSystemInfoSync().windowHeight;
  for (var i = loadedCount; i < imgs.length && i < 20; i++) {
    wx.createSelectorQuery().select("#img-" + i).boundingClientRect(function (rect) {
      if (rect.top + rect.height >= scrollTop && rect.top <= scrollTop + screenHeight) {
        imgs[i].src = imgs[i].realSrc
      }
    }).exec();
  }
  that.setData({
    loadedCount: i
  })
}).exec();

2. 节流方案

如果用户滚动过快,那么懒加载处理的图片数量和计算的次数会变多,对性能也是一种负担。因此可以采用节流方案,即限制事件的触发次数或者触发的时间间隔,这样就能够有效减少计算量和操作次数,提升性能。

var lazyLoad = function () {
  // 实现懒加载的逻辑代码...
}
var timer = null;
wx.createSelectorQuery().select("#scroll-view").fields({
  scrollOffset: true,
  size: true
}, function (res) {
  if (timer) clearTimeout(timer);
  timer = setTimeout(function () {
    var scrollTop = res.scrollTop;
    var screenHeight = wx.getSystemInfoSync().windowHeight;
    for (var i = loadedCount; i < imgs.length && i < 20; i++) {
      wx.createSelectorQuery().select("#img-" + i).boundingClientRect(function (rect) {
        if (rect.top + rect.height >= scrollTop && rect.top <= scrollTop + screenHeight) {
          imgs[i].src = imgs[i].realSrc
        }
      }).exec();
    }
    that.setData({
      loadedCount: i
    });
  }, 1000);
}).exec();

示例

示例一:瀑布流图片懒加载

<scroll-view id="scroll-view" scroll-y="true" bindscrolltolower="loadMoreData">
  <view class="waterfall">
    <view wx:for="{{imgs}}" wx:key="{{item.src}}" class="waterfall-item">
      <image id="{{'img-' + index}}" class="waterfall-img" mode="aspectFill" src="{{item.src}}"></image>
    </view>
  </view>
</scroll-view>
Page({

  data: {
    imgs: [], // 图片数组
    loadedCount: 0 // 已经加载的图片数量
  },

  onLoad: function () {
    // 初始化图片数组
    var imgs = [];
    for (var i = 1; i <= 30; i++) {
      imgs.push({
        src: '../../images/' + i + '.jpg',
        realSrc: '../../images/' + i + '.jpg'
      });
    }
    this.setData({
      imgs: imgs
    });
  },

  loadMoreData: function () {
    var that = this;
    wx.createSelectorQuery().select('#scroll-view').boundingClientRect(function (res) {
      var imgs = that.data.imgs;
      var loadedCount = that.data.loadedCount;
      for (var i = loadedCount; i < imgs.length && i < 20; i++) {
        wx.createSelectorQuery().select("#img-" + i).boundingClientRect(function (rect) {
          if (rect.top + rect.height >= res.top && rect.top <= res.bottom) {
            imgs[i].src = imgs[i].realSrc
          }
        }).exec();
      }
      that.setData({
        loadedCount: i
      });
    }).exec();
  }

})

示例二:图片列表懒加载

<scroll-view id="scroll-view" scroll-y="true" bindscrolltolower="loadMoreData">
  <view wx:for="{{imgs}}" wx:key="{{item.src}}" class="img-wrap">
    <image id="{{'img-' + index}}" class="img" mode="aspectFill" src="/images/placeholder.png"></image>
  </view>
</scroll-view>
Page({

  data: {
    imgs: [], // 图片数组
    loadedCount: 0 // 已经加载的图片数量
  },

  onLoad: function () {
    // 初始化图片数组
    var imgs = [];
    for (var i = 1; i <= 30; i++) {
      imgs.push({
        src: '../../images/' + i + '.jpg',
        realSrc: '../../images/' + i + '.jpg'
      });
    }
    this.setData({
      imgs: imgs
    });
  },

  loadMoreData: function () {
    var that = this;
    wx.createSelectorQuery().select('#scroll-view').boundingClientRect(function (res) {
      var imgs = that.data.imgs;
      var loadedCount = that.data.loadedCount;
      for (var i = loadedCount; i < imgs.length && i < 20; i++) {
        wx.createSelectorQuery().select("#img-" + i).boundingClientRect(function (rect) {
          if (rect.top + rect.height >= res.top && rect.top <= res.bottom) {
            imgs[i].src = imgs[i].realSrc
          }
        }).exec();
      }
      that.setData({
        loadedCount: i
      });
    }).exec();
  }

})

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解性能更优越的小程序图片懒加载方式 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 太吾绘卷正式版启动出错怎么办 正式版启动出错问题解决方法

    太吾绘卷是一款备受玩家喜爱的角色扮演游戏,在正式版启动时出现错误可能是由于多种原因引起的。本攻略提供几种常见的原因和解决方法来帮助玩家解决启动问题。 1. 造成问题的原因 太吾绘卷正式版启动出错可能由以下原因引起: 电脑配置问题:太吾绘卷对电脑的配置要求较高,如果电脑不满足游戏的最低配置要求可能会导致游戏启动失败。 驱动程序问题:如果您的电脑驱动程序过期或不…

    other 2023年6月27日
    00
  • Spring中Properties的配置方式

    Spring中Properties是一种常用的配置方式,可以用于在Spring上下文中配置常量、数据库连接信息等、各种服务的端口等等。下面是关于Spring中Properties的配置方式的详细讲解。 Properties配置方式 定义Properties文件 在Spring中可以定义一个Properties文件来存放各种属性,这个文件可以位于Classpa…

    other 2023年6月25日
    00
  • React Class组件生命周期及执行顺序

    React Class组件生命周期是React组件在挂载、更新和卸载时所执行的方法集合。这个过程中,React会自动调用这些方法,让我们更好地管理组件的状态和行为。这篇攻略将深入讲解React Class组件生命周期及其执行顺序,以及如何正确使用它们来构建可扩展的React应用程序。 什么是React Class组件生命周期 React Class组件生命周…

    other 2023年6月27日
    00
  • 必学:电脑与网络维护常用技巧

    必学:电脑与网络维护常用技巧攻略 前言 在我们使用电脑和互联网的过程中,难免会遇到一些问题,如软件程序出现故障、网络连接质量糟糕等等。本文将介绍电脑与网络维护的一些常用技巧,帮助读者解决这些问题。 电脑维护技巧 清理垃圾文件 随着我们使用电脑的时间越来越长,系统中的临时文件、回收站的文件、浏览器历史记录等垃圾文件会越来越多。这些文件会占据硬盘空间,导致电脑变…

    other 2023年6月26日
    00
  • 等效于oracle中的sqlserver“top1”

    以下是等效于Oracle中的SQL Server的TOP1的完整攻略,包含两个示例。 等效于Oracle中SQL Server的TOP1 在Oracle中,我们可以使用ROWNUM来获取查询结果的第一行。而在SQL Server中,我们可以使用TOP 1来获取查询结果的第一行。以下是使用TOP 1的示例代码: SELECT TOP 1 * FROM my_t…

    other 2023年5月9日
    00
  • C# 在PDF中创建和填充域

    C# 在PDF中创建和填充域攻略 步骤 1: 导入依赖库 在开始前,请确保你已经安装了以下依赖库: using iTextSharp.text; using iTextSharp.text.pdf; 步骤 2: 创建PDF并添加表单域 首先,我们需要创建一个空的PDF文件,并且添加表单域。 // 创建一个空白PDF文档 Document document =…

    other 2023年6月28日
    00
  • 微信小程序 生命周期函数详解

    微信小程序 生命周期函数详解 什么是生命周期函数 在小程序中,生命周期函数指的是小程序在不同阶段会自动执行的函数。小程序框架在不同的阶段会执行不同的生命周期函数,让开发者能够在生命周期函数中完成代码逻辑。 生命周期函数分类 小程序中的生命周期函数分为两类: 应用生命周期函数 页面生命周期函数 应用生命周期函数 应用生命周期函数是指小程序作为整个应用的部分,每…

    other 2023年6月27日
    00
  • MySQL 8.0.0开发里程碑版发布!

    MySQL 8.0.0开发里程碑版发布攻略 MySQL 8.0.0开发里程碑版是MySQL数据库的一个重要版本,它引入了许多新功能和改进。本攻略将详细介绍如何安装和配置MySQL 8.0.0开发里程碑版,并提供两个示例说明。 步骤1:下载MySQL 8.0.0开发里程碑版 首先,你需要从MySQL官方网站下载MySQL 8.0.0开发里程碑版的安装包。你可以…

    other 2023年7月29日
    00
合作推广
合作推广
分享本页
返回顶部