当前位置:首页 > 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 实现拖动图片验证功能 核心思路 拖动图片验证通常需要用户将图片拖动到指定区域或按正确顺序排列。实现时需要处理拖拽事件、验证逻辑和视觉反馈。 实现步骤 1. 基础组件结构 <templ…

加载jquery

加载jquery

加载 jQuery 的方法 通过 CDN 加载 推荐使用官方或公共 CDN(内容分发网络)加载 jQuery,速度快且稳定。将以下代码添加到 HTML 文件的 <head> 或 <b…

vue 实现异步加载

vue 实现异步加载

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

js实现图片加载

js实现图片加载

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

vue实现生成图片

vue实现生成图片

Vue 实现生成图片的方法 使用 html2canvas 库 html2canvas 是一个流行的库,可以将 DOM 元素转换为 Canvas,进而生成图片。适用于 Vue 项目。 安装 html2…

vue图片实现功能

vue图片实现功能

图片上传功能实现 使用 <input type="file"> 结合 Vue 的 v-on:change 事件监听文件选择 <template> <input ty…