【发布时间】:2023-02-12 06:26:34
【问题描述】:
这是我复制的组件:
import Image from "next/image";
import { useState } from "react";
export default function Home() {
const [downloadURL, setDownloadURL] = useState("");
const download = async () => {
const result = await fetch("http://localhost:3000/test.jpg", {
method: "GET",
headers: {},
});
const blob = await result.blob();
const url = URL.createObjectURL(blob);
setDownloadURL(url);
};
const handleDownload = async (e) => {
try {
await download();
URL.revokeObjectURL(downloadURL);
} catch (error) {
console.error(error);
}
};
return (
<div className=" bg-gray-500 bg-opacity-75 transition-opacity flex flex-col justify-center items-center">
<Image src="/test.jpg" width={500} height={600} className="mb-2 " />
<button
onClick={handleDownload}
type="button"
className="flex-1 content-center text-center bg-indigo-600 py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
>
<a href={downloadURL} download={"test"}>
Download Image
</a>
</button>
</div>
);
}
在第一次点击时,我下载了.html 文件,在接下来的点击中,我下载了图像。但我无法弄清楚是什么导致第一次点击下载 html 文件。
【问题讨论】:
-
事件冒泡,<a download> 在 <button> 内部,所以当您单击时 - 默认 <a download> 处理程序被执行,由于初始状态为空 downloadURL,然后事件传播到按钮 - 现在按钮 onClick 是执行,设置 downloadURL 等,但实际的下载事件已经发生到那个时候。
-
@SergeySosunov 解决方案是什么?
标签: javascript reactjs image next.js blob