You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

页面加载先显示默认图片,网络图片加载完成后替换的实现方案

实现默认占位图加载完成后替换为网络图片的方案

嘿,我来帮你搞定这个需求!咱们可以通过React的状态管理和图片预加载机制,轻松做到先显示本地默认图,等网络图片加载完成后再替换的效果,而且还能封装成自定义组件,用起来就像你想要的src1/src2那样方便。

核心思路

  1. 初始状态下,图片显示本地的默认图(src1对应的资源)
  2. 组件挂载后,后台创建一个Image对象去加载网络图片(src2的地址)
  3. 当网络图片加载成功时,更新组件状态,把显示的图片切换为网络图;如果加载失败,就保持默认图(也可以自定义错误处理逻辑)

具体实现代码

首先,咱们先封装一个可复用的自定义图片组件:

import { useState, useEffect } from 'react';
import defaultImg from './pics/default.jpg';

// 自定义图片组件,支持默认图和网络图的切换
const LazyLoadImage = ({ src1 = defaultImg, src2, alt = '' }) => {
  // 初始显示默认图
  const [currentSrc, setCurrentSrc] = useState(src1);

  useEffect(() => {
    // 如果没有传入网络图地址,直接返回
    if (!src2) return;

    // 创建一个Image实例来预加载网络图片
    const img = new Image();
    img.src = src2;

    // 图片加载成功时,切换显示的图片
    img.onload = () => {
      setCurrentSrc(src2);
    };

    // 可选:处理网络图片加载失败的情况,比如保持默认图或者显示错误图
    img.onerror = () => {
      console.error('网络图片加载失败,保持默认图');
      // 如果需要显示错误图,可以在这里setCurrentSrc(errorImg)
    };

    // 清理函数:组件卸载时取消图片加载
    return () => {
      img.onload = null;
      img.onerror = null;
    };
  }, [src2, src1]);

  return <img src={currentSrc} alt={alt} />;
};

// 使用示例
const App = () => {
  const networkImgUrl = 'https://cdn.pixabay.com/photo/2016/10/17/10/52/wind-farm-1747331__340.jpg';
  
  return (
    <div>
      <LazyLoadImage 
        src1={defaultImg} 
        src2={networkImgUrl} 
        alt="风力发电场" 
      />
    </div>
  );
};

export default App;

代码说明

  • 状态管理:用useState来维护当前显示的图片地址,初始值设为src1(默认图)
  • 预加载逻辑:在useEffect里创建Image对象,避免直接修改img的src导致页面出现加载空白
  • 错误处理:添加onerror事件,防止网络图片加载失败时出现裂图,提升用户体验
  • 可复用性:封装成自定义组件后,你可以在页面中任意使用,只需要传入src1src2即可

额外优化建议

  • 可以给图片添加过渡动画,让切换过程更平滑,比如给img标签加CSS:transition: opacity 0.3s ease;,加载完成时改变opacity
  • 如果需要批量处理多张图片,这个组件也能直接复用,非常方便

内容的提问来源于stack exchange,提问作者Laczkó Örs

火山引擎 最新活动