Skip to content

解决antd的Image组件打开大图片无反应

更新: 1970/1/1 08:00:00

一、问题背景

在使用 antd 的 Image 组件时,是图片加载好了才会打开显示,如果图片过大,加载的时间内页面就无任何效果,影响了用户交互


二、关键代码

我们可以手动给当前页面新增一个 loading 效果,这样用户就不会误认为是没有点击了

React
const [previewUrl, setPreviewUrl] = useState("");
const [previewLoading, setPreviewLoading] = useState(false);
/**
 * 预览或下载附件
 * @param fileUrl 附件地址
 */
function previewFile(fileUrl: string | undefined): void {
  if (!fileUrl) return;

  // 是图片时,使用Image组件预览
  if (isImageUrl(fileUrl)) {
    setPreviewLoading(true);
    const img = new window.Image();
    img.src = fileUrl;
    img.onload = () => {
      setPreviewUrl(fileUrl);
      setPreviewLoading(false);
    };
  } else {
    // 否则使用浏览器默认方式打开
    window.open(fileUrl);
  }
}
/**
 * @description 预览状态改变
 * @param {boolean} vis 是否预览
 */
function handlePreviewChange(vis: boolean) {
  // 不预览时置空预览链接
  if (!vis) {
    setPreviewUrl("");
    setPreviewLoading(false);
  }
}
return (
  <div style={{ position: "relative" }}>
    {previewLoading && (
      <div className="global-loading-overlay">
        <Spin tip="图片加载中..." size="large" />
      </div>
    )}
    <KoalaDrawer></KoalaDrawer>
    <Image
      src={previewUrl}
      style={{ display: "none" }}
      preview={{
        visible: !!previewUrl,
        onVisibleChange: handlePreviewChange,
      }}
    />
  </div>
);
less
// 打开大图片的加载loading效果
.global-loading-overlay {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 9999;
  width: 100vw;
  height: 100vh;
  background: rgba(0, 0, 0, 0.3);
  display: flex;
  align-items: center;
  justify-content: center;
}

三、最终效果