• 用Vue开发微信小程序时如何实现图片懒加载功能
  • 发布于 1周前
  • 44 热度
    0 评论
什么是懒加载?
懒加载,顾名思义,就是“懒”到极致的加载方式。它不会一次性加载所有资源,而是等到真正需要的时候才加载,这样可以有效减少初次加载时间,提升用户体验。

为什么选择懒加载?
减少初次加载时间:  只加载用户当前需要的资源,其他资源等到需要时再加载。
节省带宽:  对于图片、视频等大文件,懒加载可以显著减少不必要的数据传输。
提高页面响应速度:  快速显示页面内容,提升用户满意度。

先来了解一下Vue的懒加载,通过安装vue-lazyload实现

Vuejs懒加载
安装依赖
首先,我们需要安装Vue的懒加载库vue-lazyload。
npm install vue-lazyload --save
配置Vue
在Vue应用中全局配置vue-lazyload。
import Vue from 'vue';
import VueLazyload from 'vue-lazyload';
// 堆代码 duidaima.com
Vue.use(VueLazyload, {
  preLoad: 1.2,
  error: 'error.png',
  loading: 'loading.gif',
  attempt: 1
});
使用懒加载
在组件中使用懒加载指令v-lazy。
<template>
  <div>
    <img v-lazy="imageSrc" alt="Lazy Image">
  </div>
</template>

<script>
export default {
  data() {
    return {
      imageSrc: 'image-url.jpg'
    };
  }
}
</script>
Vuejs有着自己的懒加载库,但是微信小程序没有现成的懒加载库,我们需要手动来实现。 在微信小程序中,我们可以将懒加载逻辑封装成一个自定义组件,以便在多个页面中复用。

微信小程序懒加载组件
1. 自定义懒加载组件 WXML 结构
<!-- components/lazy-load-image/index.wxml -->
<image 
  class="lazy-image" 
  mode="aspectFill" 
  src="{{placeholder}}" 
  data-src="{{src}}" 
  style="opacity: {{loaded ? 1 : 0}}"
></image>
2. 自定义懒加载组件 WXSS 样式
/* components/lazy-load-image/index.wxss */
.lazy-image {
  transition: opacity 0.5s ease;
}
3. 自定义懒加载组件 JS 逻辑
// components/lazy-load-image/index.js
Component({
  properties: {
    src: {
      type: String,
      value: ''
    },
    placeholder: {
      type: String,
      value: 'assets/images/placeholder.png' // 默认占位图路径
    }
  },
  data: {
    loaded: false,
  },
  lifetimes: {
    attached() {
      // 绑定handlePageScroll方法,确保this指向正确
      this.pageScrollHandler = this.handlePageScroll.bind(this);
    },
    ready() {
      // 注册页面滚动事件处理函数
      this.registerPageScroll();
    },
    detached() {
      // 注销页面滚动事件处理函数
      this.unregisterPageScroll();
    }
  },
  methods: {
    // 注册页面滚动事件处理函数
    registerPageScroll() {
      // 获取当前页面栈的最后一个页面实例
      const page = getCurrentPages().pop();
      // 如果页面存在,注册滚动事件处理函数
      if (page) {
        page.onPageScroll(this.pageScrollHandler);
      }
    },
    // 注销页面滚动事件处理函数
    unregisterPageScroll() {
      // 获取当前页面栈的最后一个页面实例
      const page = getCurrentPages().pop();
      // 如果页面存在,注销滚动事件处理函数
      if (page) {
        page.offPageScroll(this.pageScrollHandler);
      }
    },
    // 页面滚动事件处理函数
    handlePageScroll(e) {
      // 获取组件内.lazy-image元素的位置信息
      const rect = this.getRect('.lazy-image');
      // 如果图片元素在视窗内,且距离顶部的距离小于视窗高度的75%,则开始加载图片
      if (rect && rect.top <= wx.getSystemInfoSync().windowHeight * 0.75) {
        this.loadImage();
      }
    },
    // 加载图片的方法
    loadImage() {
      // 如果图片尚未加载
      if (!this.data.loaded) {
        // 更新组件数据,将图片的src属性设置为实际图片URL,并标记图片已加载
        this.setData({
          src: this.data.src,
          loaded: true
        });
      }
    }
  }
});
代码中的注释应该可以详细了解每个方法是做什么的吧~

我们可以看到组件是如何在它的生命周期中注册和注销页面滚动事件的,以及如何定义和使用 handlePageScroll 方法来监听页面滚动并触发图片加载。loadImage 方法则用于更新组件状态,将图片从占位图替换为实际图片,并添加透明度渐变效果。

下面主要描述一下传参就好了~
参数 描述
src 接收父组件传入的实际图片URL
placeholder 特殊情况下需要传入,一般全局都用同一个默认图
loaded 用于记录图片是否已加载
小结一下
在微信小程序中实现懒加载,虽然代码量较大,但这也给了我们更多的控制权。我们可以针对小程序的特点,优化懒加载的策略,比如结合小程序的分包加载机制,进一步减少首屏加载时间。然而,手动实现懒加载也意味着我们需要投入更多的精力去维护和测试,以确保其稳定性和兼容性。

总结
懒加载技术在Vue和微信小程序中的应用,无疑能够显著提升应用的性能和用户体验。然而,这同时也带来了更多的开发和维护工作。作为开发者,我们需要权衡利弊,选择最适合项目需求的实现方式。在实际开发中,我倾向于结合项目的具体需求和团队的技术栈,选择最合适的懒加载策略。同时,我也在探索更多的自动化工具和方法,以减少重复劳动,提高开发效率。

性能优化是一个持续的过程,需要我们不断地学习新技术,同时也要勇于创新和尝试。希望我的分享能够给大家带来一些启发,也欢迎大家留言讨论,共同进步。
用户评论