【问题标题】:Next.js Image component props onLoadingComplete not working?Next.js 图片组件道具 onLoadingComplete 不起作用?
【发布时间】:2021-11-17 22:32:30
【问题描述】:

我正在尝试从 onLoadingComplete 道具获取 naturalWidthnaturalHeighthttps://nextjs.org/docs/api-reference/next/image#onloadingcomplete 但它不起作用?也许我做错了?

我有这个功能:

const handleImageLoad = (e) => {
  console.log("load", e);
};

然后我有这个来自 next.js 的组件

<Image
  onLoadingComplete={(e) => handleImageLoad(e)}
  className=""
  src={image["data_url"]}
  alt=""
  layout="fill"
  objectFit="contain"
/>

加载图像时,它什么也不做,如果我尝试控制台日志,它可以工作,但我不知道为什么当我通过handleImageLoad时它不工作

onLoadingComplete={() => handleImageLoad()}

【问题讨论】:

  • 您能给我们提供一个MRE吗?根据您当前的描述,我无法重现该问题:codesandbox.io/s/loving-mahavira-9ygdi?file=/pages/…(重定向到 /layout-fill 并向下滚动到第二张图片以查看日志。)
  • @brc-dd 所以我有一个代码框,您可以在其中上传图片:codesandbox.io/s/proud-rain-d51sv?file=/pages/index.js,第 62-63 行
  • 看来onLoadingComplete 不会在数据(base64)URI 的情况下被触发。此外,第 63 行的事情似乎正在工作,因为它只是在每个组件安装/渲染上被简单地调用。 () =&gt; {console.log('loaded')} 应该可以工作,但事实并非如此。我想您需要在 Next.js 的 GitHub 上为此创建一个问题/讨论。一种解决方法是创建 blob:// URL,而不是数据 URI。我不确定它是否会起作用。
  • 可以确认它正在处理对象 URL (blob:)。 codesandbox.io/s/jolly-ellis-4htdl?file=/pages/index.js
  • @brc-dd 也可以确认。谢谢!你想创建一个答案以便我接受吗?

标签: reactjs next.js react-props nextjs-image


【解决方案1】:

编辑:已在 v11.1.3-canary.33 中修复


如果src 是数据URI,则next/image 组件似乎没有调用onLoadingComplete 处理程序。 (我可以看到你已经打开了一个问题here 。)

目前可以使用Object URLs 解决方法。如果你愿意,你可以直接实现它。请参阅this thread 或链接的问题。

如果你想继续使用react-images-uploading,你可以使用this thread等中提到的方法,将提供的数据URI转换为Object URL,然后将其作为src传递给next/image。显然,这将是比自己处理上传的文件更重性能的操作。

这是一个工作示例:https://codesandbox.io/s/jolly-ellis-4htdl?file=/pages/index.js

为了完整起见,仅添加一个替代方案:

import { useState } from "react";
import Image from "next/image";

const IndexPage = () => {
  const [src, setSrc] = useState("");

  const handleChange = (e) => {
    setSrc(URL.createObjectURL(e.target.files[0]));
    return true;
  };

  const handleImageLoad = (e) => {
    console.log("load", e);
  };

  return (
    <>
      <input
        type="file"
        id="foo"
        name="foo"
        accept="image/png, image/jpeg"
        onChange={handleChange}
      />
      <div
        style={{
          marginTop: "1rem",
          width: 600,
          height: 600,
          backgroundColor: "blue",
          position: "relative"
        }}
      >
        {src?.length > 0 && (
          <Image
            onLoadingComplete={(e) => {
              handleImageLoad(e);
            }}
            src={src}
            alt=""
            layout="fill"
            objectFit="contain"
          />
        )}
      </div>
    </>
  );
};

export default IndexPage;

【讨论】:

  • 非常感谢!很好奇.. 如果react-images-uploading 由于这个问题可能不是最好的,你知道我应该研究什么其他包来上传图片吗?
  • @hellomello 试试react-dropzone。这里有一个演示 - react-dropzone.js.org/#section-previews
  • @hellomello Next.js 团队已开始对此进行修复。经过适当的测试集成后,它将被合并,并会在下一个补丁版本中出现。
  • 我看到了!谢谢!感谢您将其提交给团队的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
相关资源
最近更新 更多