react和vue图片懒加载及实现原理

server/2024/11/24 19:31:37/

一、实现原理

  1. 核心思想

    • 只有当图片出现在视口中时,才加载图片。
    • 利用占位图或占位背景优化用户体验。
  2. 实现技术

    • 监听滚动事件:监听页面滚动,通过计算图片与视口的位置关系,判断是否需要加载图片。
    • Intersection Observer(推荐):现代浏览器提供的 API,用于检测目标元素是否进入视口,比滚动事件性能更好。
  3. 步骤

    • 设置图片的占位符(如灰色背景、默认图片)。
    • 检测图片元素是否进入视口。
    • 当图片进入视口时,将 src 属性替换为实际图片地址。

二、React 实现图片懒加载

1. 使用 Intersection Observer 实现

.

import React, { useRef, useState, useEffect } from 'react';const LazyImage = ({ src, alt, placeholder, className }) => {const [isLoaded, setIsLoaded] = useState(false);const imgRef = useRef();useEffect(() => {const observer = new IntersectionObserver(([entry]) => {if (entry.isIntersecting) {setIsLoaded(true);observer.disconnect(); // 图片加载后停止观察}},{ threshold: 0.1 } // 10% 进入视口时触发);if (imgRef.current) {observer.observe(imgRef.current);}return () => {if (observer && imgRef.current) {observer.unobserve(imgRef.current);}};}, []);return (<imgref={imgRef}src={isLoaded ? src : placeholder}alt={alt}className={className}/>);
};export default LazyImage;
2. 第三方库
  • react-lazyload:轻量级懒加载库,支持图片、组件等。
npm install react-lazyload
import React from 'react';
import LazyLoad from 'react-lazyload';const LazyImage = ({ src, alt, height }) => (<LazyLoad height={height} offset={100}><img src={src} alt={alt} /></LazyLoad>
);export default LazyImage;

三、Vue 实现图片懒加载

1. 使用 Intersection Observer
<template><img:src="isLoaded ? src : placeholder":alt="alt"ref="imageRef"class="lazy-image"/>
</template><script>
export default {props: {src: String,placeholder: String,alt: String,},data() {return {isLoaded: false,};},mounted() {const observer = new IntersectionObserver(([entry]) => {if (entry.isIntersecting) {this.isLoaded = true;observer.disconnect();}},{ threshold: 0.1 });observer.observe(this.$refs.imageRef);},
};
</script>
2. 使用指令(全局注册)

懒加载在 Vue 中可通过自定义指令实现:

// directive-lazyload.js
export const lazyload = {mounted(el, binding) {const loadImage = () => {const imageElement = el;if (imageElement) {imageElement.src = binding.value;}};const observer = new IntersectionObserver(([entry]) => {if (entry.isIntersecting) {loadImage();observer.disconnect();}});observer.observe(el);},
};

注册全局指令:

import { lazyload } from './directive-lazyload';
const app = createApp(App);
app.directive('lazyload', lazyload);

使用

<template><img v-lazyload="imageSrc" alt="Lazy loaded image" />
</template><script>
export default {data() {return {imageSrc: 'https://example.com/image.jpg',};},
};
</script>
3. 第三方库
  • vue-lazyload
npm install vue-lazyload
import VueLazyload from 'vue-lazyload';
app.use(VueLazyload, {loading: 'path/to/loading-image.png', // 占位图error: 'path/to/error-image.png',   // 错误图
});<template><img v-lazy="imageSrc" alt="Lazy loaded image" />
</template>

四、性能优化与注意事项

  1. 减少主线程开销:优先使用 Intersection Observer,避免滚动事件监听。
  2. 设置占位图:使用占位图片或颜色,避免加载空白区域影响体验。
  3. 图片格式优化
    • 使用 WebP 等高压缩比格式。
    • 根据设备和网络情况选择适配图片(如 srcsetpicture 标签)。
  4. 懒加载阈值:通过设置 offsetthreshold 提前加载,提高滚动时的视觉连续性。
  5. 服务器优化:开启图片的 lazy 属性,结合懒加载策略。

通过上述方法,React 和 Vue 都可以灵活实现高性能的图片懒加载功能。


http://www.ppmy.cn/server/144623.html

相关文章

Scala学习记录,Array

数组&#xff1a;物理空间上连续的&#xff08;一个挨一个&#xff09;优势&#xff1a;根据下标能快速找到元素。 列表&#xff1a;物理空间上不连续&#xff08;不是一个元素挨着一个元素的&#xff09;优势&#xff1a;插入元素&#xff0c;删除较快。 Array定义&#xff…

大数据面试题每日练习--HDFS是如何工作的?

HDFS&#xff08;Hadoop Distributed File System&#xff09;是一个分布式文件系统&#xff0c;设计用于存储非常大的文件。它的主要工作原理如下&#xff1a; NameNode&#xff1a;管理文件系统的命名空间&#xff0c;维护文件目录树和文件元数据信息。NameNode记录每个文件…

一学就废|Python基础碎片,列表(List)

列表(数组)是一种常见的数据结构&#xff0c;通常&#xff0c;列表的共性操作包括获取、设置、搜索、过滤和排序。以下是对列表的一些常用的操作方法。 基本操作 我们可以在 Python 中操作列表的方法有很多。在我们开始学习这些通用操作之前&#xff0c;以下片段显示了列表最常…

[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式

0. 制作过程 如果你想知道这个镜像是如何制作的&#xff0c;请看下面的教程&#xff0c;如果你只想拿到镜像。那就往下看就好了 链接&#xff1a; 1. 获取源码 源码下载请参考&#xff1a;OHOS_5.0中的[源码下载]章节&#xff0c;建议使用镜像站点下载。 2. 获取镜像 在Git…

【STM32】MPU6050初始化常用寄存器说明及示例代码

一、MPU6050常用配置寄存器 1、电源管理寄存器1&#xff08; PWR_MGMT_1 &#xff09; 此寄存器允许用户配置电源模式和时钟源。 DEVICE_RESET &#xff1a;用于控制复位的比特位。设置为1时复位 MPU6050&#xff0c;内部寄存器恢复为默认值&#xff0c;复位结束…

鸿蒙操作系统(HarmonyOS)开发的初学者了解和入门

1. 什么是鸿蒙操作系统&#xff08;HarmonyOS&#xff09; 鸿蒙操作系统是华为开发的一种分布式操作系统&#xff0c;面向多种设备&#xff08;如智能手机、智能家居设备、穿戴设备、车机等&#xff09;。它的特点包括&#xff1a; 分布式架构&#xff1a;支持跨设备无缝协作…

ArcGIS计算水库库容量

一、数据获取 DEM数据来源于地理空间数据云&#xff0c;该网站是由中科院计算机网络信息中心于2008年创立的地学大数据平台。 二、填洼 将DEM数据中凹陷的区域填充至与倾斜点同样高度&#xff0c;这里的【Z限制】说的是设定一个特定的值&#xff0c;凹陷区域的最低点高程与倾斜…

【大数据学习 | Spark-Core】Spark的改变分区的算子

当分区由多变少时&#xff0c;不需要shuffle&#xff0c;也就是父RDD与子RDD之间是窄依赖。 当分区由少变多时&#xff0c;是需要shuffle的。 但极端情况下&#xff08;1000个分区变成1个分区)&#xff0c;这时如果将shuffle设置为false&#xff0c;父子RDD是窄依赖关系&…