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

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

懒加载方式的原理

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

基本实现方式

小程序里的图片组件是<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日

相关文章

  • objdump命令

    objdump命令 objdump是一个强大的二进制文件分析工具,可以用于查看二进制文件的汇编代码、符号表、重定位表等信息。本攻略将介绍objdump的基本用法和示例。 基本用法 objdump基本用法如下: objdump [options] file 其中,file是要分析的二进制文件,options是命令选项,可以用于指定分析的内容和格式等。 以下是常…

    other 2023年5月9日
    00
  • 正当防卫4Direct3D Error怎么办 Direct3D Error闪退最新解决方法

    针对这个问题,我们可以提供以下完整攻略。 问题描述 在运行“正当防卫4”游戏时,可能会遇到Direct3D Error问题,导致游戏崩溃或者闪退。这个问题可能是由于显卡驱动不兼容、DirectX运行库缺失等原因引起的。 解决方法 方法一:更新显卡驱动 步骤一:打开“设备管理器”,在“显示适配器”中找到你的显卡型号。 步骤二:访问显卡厂商官网,下载最新的驱动程…

    other 2023年6月27日
    00
  • 详解C++中对构造函数和赋值运算符的复制和移动操作

    以下是详解C++中对构造函数和赋值运算符的复制和移动操作的完整攻略: 1. 构造函数的复制和移动操作 复制构造函数 当我们定义一个新的对象并且使用已经存在的对象进行初始化时,复制构造函数就会被调用。复制构造函数的定义格式如下: class MyClass { public: MyClass(); // 默认构造函数 MyClass(const MyClass…

    other 2023年6月26日
    00
  • 清空sqlserver数据库中所有表数据的方法

    清空SQL Server数据库中所有表数据的方法可以通过以下步骤实现: 步骤1:生成清空表数据的脚本 首先,您需要生成清空表数据的脚本。您可以使用以下脚本生成清空表数据的脚本: EXEC sp_MSForEachTable ‘ALTER TABLE ? NOCHECK CONSTRAINT ALL’ EXEC sp_MSForEachTable ‘DELET…

    other 2023年5月6日
    00
  • ci框架浅析(全篇)

    CI框架浅析 CI(CodeIgniter)是一个轻量级的PHP框架,是现代化的Web应用程序开发的理想选择。下面我们就来具体分析一下CI框架的特点。 优点 简单易用 CI框架非常简单直观,对于初学者也比较友好,易于理解和上手。同时CI框架提供了强大的工具箱,支持快速开发和部署Web应用程序。 速度快 CI框架是轻量级框架,所以它的运行速度非常快。CI框架内…

    其他 2023年3月29日
    00
  • es实战之查询大量数据

    以下是“ES实战之查询大量数据的完整攻略”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: ES实战之查询大量数据的完整攻略 Elasticsearch(ES)是一个开源的分布式搜索引擎,可以用于存储、搜索和分析大量数据。在实际应用中,我们经常需要查询大量数据,以获得更准确、更有用的结果。以下是ES查询大量数据的完整攻略: 1. 使用scr…

    other 2023年5月10日
    00
  • WPS for Linux(ubuntu)字体配置(字体缺失解决办法)

    WPS for Linux(ubuntu)字体配置(字体缺失解决办法) WPS是一款跨平台的办公软件,支持Windows、Linux和macOS等操作系统。在Linux系统中,WPS for Linux(ubuntu)字体配置是一个常见的问题,因为WPS在Linux系统中需要依赖一些字体库,如果缺失这些字体库,就会导致WPS无法正常显示中文等内容。本文将介绍…

    other 2023年5月5日
    00
  • 如何用命令行进入mysql具体操作步骤

    当我们需要进入MySQL数据库进行数据操作的时候,可以通过命令行进行进入。下面是使用命令行进入MySQL的具体步骤: 步骤一:打开终端 在Windows系统下,可以通过“开始菜单-搜索-运行”并输入cmd命令来打开终端;在Mac OS、Linux等Unix-like系统下,则可以通过打开终端应用程序来进入终端。 步骤二:输入命令 在终端中输入以下命令来进入M…

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