当前位置:首页 > React

react 实现图片懒加载

2026-01-27 13:34:39React

使用 Intersection Observer API

Intersection Observer API 是浏览器原生支持的 API,可以高效地监听元素是否进入视口。这种方法性能较好,适合现代浏览器。

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

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

  useEffect(() => {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach((entry) => {
        if (entry.isIntersecting) {
          setIsLoaded(true);
          observer.unobserve(entry.target);
        }
      });
    });

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

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

  return (
    <img
      ref={imgRef}
      src={isLoaded ? src : placeholder}
      alt={alt}
      style={{ opacity: isLoaded ? 1 : 0.5, transition: 'opacity 0.3s' }}
    />
  );
};

export default LazyImage;

使用自定义滚动事件监听

对于不支持 Intersection Observer API 的旧浏览器,可以通过监听滚动事件实现懒加载。需要注意节流或防抖以避免性能问题。

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

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

  const checkIfInView = () => {
    if (imgRef.current) {
      const rect = imgRef.current.getBoundingClientRect();
      const isVisible = rect.top <= window.innerHeight && rect.bottom >= 0;
      if (isVisible) {
        setIsLoaded(true);
        window.removeEventListener('scroll', checkIfInView);
      }
    }
  };

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

  return (
    <img
      ref={imgRef}
      src={isLoaded ? src : placeholder}
      alt={alt}
      style={{ opacity: isLoaded ? 1 : 0.5, transition: 'opacity 0.3s' }}
    />
  );
};

export default LazyImage;

使用第三方库

如果不想手动实现,可以使用现成的 React 懒加载库,如 react-lazyloadreact-lazy-load-image-component

安装 react-lazyload

npm install react-lazyload

使用示例:

react 实现图片懒加载

import React from 'react';
import LazyLoad from 'react-lazyload';

const LazyImage = ({ src, alt }) => (
  <LazyLoad height={200} offset={100}>
    <img src={src} alt={alt} />
  </LazyLoad>
);

export default LazyImage;

注意事项

  • 占位符:懒加载时建议使用占位符(如低分辨率图片或纯色背景)以避免布局跳动。
  • 性能优化:滚动事件监听需要节流或防抖,Intersection Observer 是更优选择。
  • SEO:确保搜索引擎能抓取懒加载的图片,可以通过 noscript 标签或服务器端渲染支持。

以上方法可根据项目需求和技术栈选择适合的实现方式。

标签: 加载图片
分享给朋友:

相关文章

vue实现加载

vue实现加载

Vue 实现加载功能的方法 使用 v-if 或 v-show 控制加载状态 通过数据绑定控制加载动画的显示与隐藏。v-if 会完全移除 DOM 元素,v-show 只是切换 display 属性。…

vue实现组件循环图片

vue实现组件循环图片

Vue 实现组件循环图片的方法 在 Vue 中实现组件循环图片通常可以通过 v-for 指令结合动态数据绑定完成。以下是几种常见的实现方式: 使用静态图片路径数组 假设有一组本地图片路径,可以通过数…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

jquery 加载

jquery 加载

jQuery 加载方法 使用jQuery需要先将其库文件加载到网页中。以下是几种常见的加载方式: 通过CDN加载 推荐使用官方或公共CDN(内容分发网络)加载jQuery,速度快且可能被浏览器缓存:…

vue实现图片编辑

vue实现图片编辑

Vue实现图片编辑的方法 使用第三方库vue-cropper 安装vue-cropper库: npm install vue-cropperjs 在Vue组件中使用: <template&g…

react如何加载网页

react如何加载网页

使用 React 加载网页的方法 通过 iframe 嵌入网页 在 React 组件中,可以通过 iframe 标签直接加载外部网页。这种方式简单直接,适合嵌入第三方页面或静态内容。 import…