当前位置:首页 > React

react如何解决图片懒加载

2026-01-26 01:22:59React

React 实现图片懒加载的方法

使用 Intersection Observer API
Intersection Observer 是浏览器原生 API,可高效检测元素是否进入视口。通过监听目标元素与视口的交叉状态,实现懒加载。

import { useEffect, useRef } from 'react';

const LazyImage = ({ src, alt }) => {
  const imgRef = useRef(null);

  useEffect(() => {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          const img = entry.target;
          img.src = src;
          observer.unobserve(img);
        }
      });
    }, { threshold: 0.1 });

    if (imgRef.current) observer.observe(imgRef.current);

    return () => {
      if (imgRef.current) observer.unobserve(imgRef.current);
    };
  }, [src]);

  return <img ref={imgRef} alt={alt} />;
};

使用第三方库(如 react-lazy-load-image-component)
现成库封装了复杂逻辑,简化实现过程。例如 react-lazy-load-image-component 提供开箱即用的组件。

import { LazyLoadImage } from 'react-lazy-load-image-component';
import 'react-lazy-load-image-component/src/effects/blur.css';

const MyImage = () => (
  <LazyLoadImage
    src="image.jpg"
    alt="Example"
    effect="blur" // 可选加载效果
    placeholderSrc="placeholder.jpg" // 占位图
  />
);

自定义滚动事件监听(兼容旧浏览器)
对于不支持 Intersection Observer 的环境,可通过监听滚动事件手动判断元素位置。

import { useEffect, useRef, useState } from 'react';

const LazyImage = ({ src, alt }) => {
  const imgRef = useRef(null);
  const [isLoaded, setIsLoaded] = useState(false);

  const checkVisibility = () => {
    if (imgRef.current && !isLoaded) {
      const rect = imgRef.current.getBoundingClientRect();
      if (rect.top < window.innerHeight && rect.bottom > 0) {
        setIsLoaded(true);
      }
    }
  };

  useEffect(() => {
    window.addEventListener('scroll', checkVisibility);
    checkVisibility(); // 初始检查
    return () => window.removeEventListener('scroll', checkVisibility);
  }, []);

  return <img ref={imgRef} src={isLoaded ? src : ''} alt={alt} />;
};

优化建议

添加占位符与加载状态
使用低分辨率占位图(LQIP)或纯色背景,避免布局偏移。CSS 可设置默认宽高比容器。

.lazy-image-container {
  aspect-ratio: 16/9;
  background-color: #f0f0f0;
}

性能注意事项
滚动事件监听需配合节流(throttle)或防抖(debounce)。Intersection Observer 是首选方案,性能更优且无需手动管理事件。

服务端渲染(SSR)兼容
在 Next.js 等框架中,可直接使用内置 next/image 组件,支持懒加载与自动优化。

import Image from 'next/image';

<Image src="/image.jpg" alt="Example" width={500} height={300} lazy />

react如何解决图片懒加载

分享给朋友:

相关文章

vue实现预加载

vue实现预加载

vue实现预加载的方法 在Vue中实现预加载可以通过多种方式优化用户体验,以下是几种常见方法: 使用Webpack的魔法注释 通过import()语法结合Webpack的/* webpackPre…

vue实现图片加载

vue实现图片加载

Vue 实现图片加载的方法 在 Vue 中实现图片加载可以通过多种方式,以下是一些常见的方法: 使用 v-bind 绑定图片路径 通过 v-bind 动态绑定图片路径,可以灵活地加载本地或远程图片…

js实现图片加载

js实现图片加载

使用Image对象加载图片 通过JavaScript的Image对象可以动态加载图片,适用于需要预加载或动态插入图片的场景。 const img = new Image(); img.src =…

js实现页面加载

js实现页面加载

监听 DOMContentLoaded 事件 使用 DOMContentLoaded 事件可以在 HTML 文档完全加载和解析后触发,无需等待样式表、图像等外部资源加载完成。 document.…

js实现图片的懒加载

js实现图片的懒加载

实现图片懒加载的基本原理 懒加载的核心思想是延迟加载非视口内的图片,当用户滚动页面时再动态加载即将进入视口的图片资源。这能显著减少页面初始加载时的网络请求和带宽消耗。 Intersection Ob…

vue实现加载动画

vue实现加载动画

Vue 实现加载动画的方法 在 Vue 中实现加载动画可以通过多种方式完成,以下是一些常见的方法: 使用 CSS 动画 通过 CSS 定义动画效果,结合 Vue 的动态类绑定实现加载动画。以下是一…