当前位置:首页 > 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 提供开箱即用的组件。

react如何解决图片懒加载

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 可设置默认宽高比容器。

react如何解决图片懒加载

.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 />

分享给朋友:

相关文章

vue 实现异步加载

vue 实现异步加载

Vue 异步加载的实现方法 动态导入组件(懒加载) 使用 import() 语法动态导入组件,Vue 会将其转换为异步加载的组件。适用于路由或组件按需加载。 const AsyncComponent…

vue实现加载条

vue实现加载条

Vue 实现加载条的方法 使用第三方库(如 NProgress) 安装 NProgress 库: npm install nprogress 在 Vue 项目中引入并使用: import NPro…

vue实现同步加载

vue实现同步加载

Vue 实现同步加载的方法 在 Vue 中,通常推荐使用异步加载(如 async/await 或 Promise)来优化性能,但在某些场景下可能需要同步加载。以下是几种实现同步加载的方法: 使用 c…

vue实现懒加载

vue实现懒加载

Vue 实现懒加载的方法 懒加载(Lazy Loading)是一种优化技术,用于延迟加载非关键资源,从而提升页面初始加载速度。Vue 中可以通过多种方式实现懒加载,以下是几种常见方法: 路由懒加载…

vue实现文件在线加载

vue实现文件在线加载

实现文件在线加载的基本方法 在Vue中实现文件在线加载,通常需要结合前端文件处理和后端服务支持。以下是几种常见的方法: 使用input标签和FileReader API 在Vue组件中添加input…

vue实现页面懒加载

vue实现页面懒加载

Vue 实现页面懒加载的方法 在 Vue 中实现页面懒加载可以通过路由懒加载和组件懒加载两种方式实现,以下是具体方法: 路由懒加载 路由懒加载是通过动态导入组件的方式实现,仅在访问对应路由时才加载相…