微信小程序实现图片懒加载的4种方案

实现图片懒加载的意义

实现图片懒加载可以提高小程序的性能和用户体验,是微信小程序开发中非常重要的一项优化手段。微信小程序实现图片懒加载的目的主要有以下几点:

  1. 提高页面加载速度:图片通常是页面中最耗时的资源,如果一次性加载所有图片,会导致页面加载速度变慢,从而影响用户体验。通过图片懒加载,可以只加载当前可见区域内的图片,提高页面加载速度。
  2. 减少流量消耗:在移动网络环境下,流量是一种珍贵资源,如果一次性加载所有图片,会导致流量消耗过大,从而影响用户体验。通过图片懒加载,可以只加载当前可见区域内的图片,减少流量消耗。
  3. 优化内存使用:如果一次性加载所有图片,会导致小程序占用过多的内存,从而影响小程序的稳定性和性能。通过图片懒加载,可以只加载当前可见区域内的图片,优化内存使用。
  4. 提高用户体验:通过图片懒加载,可以只加载当前可见区域内的图片,避免用户需要等待过长时间才能看到页面内容,从而提高用户体验。

微信小程序中实现图片懒加载的方案

一. 使用 wx:if 条件渲染

这种方案是将图片的 src 属性设置为一个空字符串,然后在需要显示图片时,通过 wx:if 条件渲染来动态设置 src 属性,从而实现图片的懒加载。具体实现步骤如下:

  1. 在 WXML 文件中,使用 wx:if 条件渲染来判断图片是否需要显示。
html 复制代码
<image wx:if="{{showImage}}" src="{{imageSrc}}" mode="aspectFill"></image>
  1. 在 JS 文件中,定义一个变量 showImage,初始值为 false,表示图片不显示。
javascript 复制代码
Page({
  data: {
    showImage: false,
    imageSrc: ''
  },
  onLoad: function () {
    // 在页面加载时,获取图片的 URL
    const imageUrl = 'https://example.com/image.jpg'
    this.setData({
      imageSrc: imageUrl
    })
  },
  onImagesLoaded: function () {
    // 在图片加载完成后,设置 showImage 为 true,显示图片
    this.setData({
      showImage: true
    })
  }
})
  1. 在 WXML 文件中,为 image 组件绑定 bindload 事件,在图片加载完成后触发 onImagesLoaded 函数。
html 复制代码
<image wx:if="{{showImage}}" src="{{imageSrc}}" mode="aspectFill" bindload="onImagesLoaded"></image>

二. 使用 IntersectionObserver 组件

这种方案是使用微信小程序提供的 IntersectionObserver 组件,来监听图片是否出现在可视区域内,从而实现图片的懒加载。具体实现步骤如下:

  1. 在 WXML 文件中,使用 IntersectionObserver 组件来监听图片是否出现在可视区域内。
html 复制代码
<view class="image-wrapper">
  <image class="image" src="{{imageSrc}}" mode="aspectFill"></image>
</view>
<intersection-observer class="observer" bindintersection="onIntersection"></intersection-observer>
  1. 在 JS 文件中,定义一个变量 imageSrc,初始值为一个空字符串,表示图片不显示。
javascript 复制代码
Page({
  data: {
    imageSrc: ''
  },
  onLoad: function () {
    // 在页面加载时,获取图片的 URL
    const imageUrl = 'https://example.com/image.jpg'
    this.setData({
      imageSrc: imageUrl
    })
  },
  onIntersection: function (res) {
    // 在图片出现在可视区域内时,设置 imageSrc 为图片的 URL
    if (res.intersectionRatio > 0) {
      this.setData({
        imageSrc: res.target.dataset.src
      })
    }
  }
})
  1. 在 WXML 文件中,为 image 组件设置 data-src 属性,用于存储图片的 URL。
html 复制代码
<image class="image" data-src="{{imageSrc}}" mode="aspectFill"></image>
  1. 在 JS 文件中,为 IntersectionObserver 组件绑定 bindintersection 事件,在图片出现在可视区域内时触发 onIntersection 函数。
html 复制代码
<intersection-observer class="observer" bindintersection="onIntersection"></intersection-observer>

三. 使用自定义组件

可以创建一个自定义组件,将图片的 URL 和是否显示图片的状态封装在组件内部,然后在页面中使用自定义组件来实现图片的懒加载。具体实现步骤如下:

  1. 创建一个自定义组件,例如 lazy-image。
  2. 在自定义组件的 WXML 文件中,使用 image 组件来显示图片,并使用 wx:if 条件渲染来判断图片是否需要显示。
html 复制代码
<image wx:if="{{showImage}}" src="{{imageSrc}}" mode="aspectFill"></image>
  1. 在自定义组件的 JS 文件中,定义一个变量 showImage,初始值为 false,表示图片不显示。
javascript 复制代码
Component({
  properties: {
    src: String
  },
  data: {
    showImage: false
  },
  ready: function () {
    // 在组件准备完毕后,设置 imageSrc 为图片的 URL
    this.setData({
      imageSrc: this.properties.src
    })
  },
  attached: function () {
    // 在组件附加到页面节点树时,监听组件的可视状态
    this.observer = wx.createIntersectionObserver(this, {
      observeAll: true
    })
    this.observer.relativeToViewport({
      bottom: 0
    })
    this.observer.observe('.image', res => {
      if (res.intersectionRatio > 0) {
        this.setData({
          showImage: true
        })
      }
    })
  },
  detached: function () {
    // 在组件从页面节点树移除时,取消监听组件的可视状态
    this.observer.disconnect()
  }
})
  1. 在页面的 WXML 文件中,使用自定义组件来显示图片。
html 复制代码
<lazy-image src="https://example.com/image.jpg"></lazy-image>

四. 使用 scroll-view 组件

可以使用 scroll-view 组件来实现图片的懒加载,具体实现步骤如下:

  1. 在 WXML 文件中,使用 scroll-view 组件来显示图片列表。
html 复制代码
<scroll-view scroll-y="true" bindscrolltolower="loadMore">
  <image wx:for="{{images}}" wx:key="index" src="{{item}}" mode="aspectFill"></image>
</scroll-view>
  1. 在 JS 文件中,定义一个变量 images,用于存储图片的 URL 数组。
javascript 复制代码
Page({
  data: {
    images: []
  },
  onLoad: function () {
    // 在页面加载时,获取图片的 URL 数组
    const images = ['https://example.com/image1.jpg', 'https://example.com/image2.jpg', 'https://example.com/image3.jpg']
    this.setData({
      images: images
    })
  },
  loadMore: function () {
    // 在滚动到页面底部时,加载更多图片
    const images = this.data.images
    const newImages = ['https://example.com/image4.jpg', 'https://example.com/image5.jpg', 'https://example.com/image6.jpg']
    this.setData({
      images: images.concat(newImages)
    })
  }
})
  1. 在 WXML 文件中,为 scroll-view 组件绑定 bindscrolltolower 事件,在滚动到页面底部时触发 loadMore 函数,从而实现图片的懒加载。
html 复制代码
<scroll-view scroll-y="true" bindscrolltolower="loadMore">
 <image wx:for="{{images}}" wx:key="index" src="{{item}}" mode="aspectFill"></image>
</scroll-view>

总之,这些方法都可以实现微信小程序中的图片懒加载,具体使用哪种方法取决于具体的需求和场景。

相关推荐
李纲明2 小时前
微信小程序租赁归还说本来就坏或配件对不上:先核借还点验与随单存证,再查差异计价公示
微信小程序·devdiy·租赁点验·借还拍照·随单存证·差异计价·押金释放
李纲明21 小时前
微信小程序次卡跨店对不上账或前台随手改余次:先核流水只增不改与统一日切,再查冲正权限与总部只读
微信小程序·devdiy·核销流水·跨店次卡·日切对账·冲正权限·总部只读
李纲明1 天前
微信小程序维修拆机后口头加价或未确认就开工:先核验机快照与报价确认,再查补充报价与取机核验
微信小程序·devdiy·维修验机·报价确认·报价快照·补充报价·取机核验
wx1qq1com1 天前
一桩带几台车:共享租赁桩位配比、取电与结算闭环设计
物联网·微信小程序·小程序
李纲明1 天前
微信小程序场地长租月底对不上或口头占场撞场:先核合约预约与核销流水出账,再查附加费与转租归属
微信小程序·devdiy·场地长租·月结账单·核销流水·附加费·转租归属
2401_879692511 天前
微信小程序照相与摄像功能实现——chooseImage 与 chooseVideo 详解
微信小程序·小程序·notepad++
律宏阔2 天前
微信小程序 + Taro + TDesign 去掉 [&&&],让普通 Tailwind 类接管局部样式
前端·微信小程序·taro
律宏阔2 天前
微信小程序 + Taro + 多语言实现与国际化检查实录
前端·微信小程序·taro
李纲明3 天前
微信小程序 getSystemInfo 提示已废弃、屏幕高度算错胶囊还对不齐?getWindowInfo 和 getDeviceInfo 怎么接才稳
javascript·微信小程序·小程序·小程序开发·devdiy
dreams_dream3 天前
微信小程序-使用npm包
微信小程序·小程序·npm