这些答案很有帮助,但是有一种方法可以通过利用钩子来实现这一点,而无需key
每次都通过:useEffect
useEffect(() => {
set_imgSrc(src);
}, [src]);
此外,onError
对于某些图像,该事件似乎不会触发(我相信layout='fill'
在某些情况下不会触发它),对于那些我一直在使用的情况onLoadingComplete
,然后我检查图像的宽度是否为 0
onLoadingComplete={(result) => {
if (result.naturalWidth === 0) { // Broken image
set_imgSrc(fallbackSrc);
}
}}
完整代码:
import Image from "next/image";
import { useEffect, useState } from "react";
export default function ImageFallback({ src, fallbackSrc, ...rest }) {
const [imgSrc, set_imgSrc] = useState(src);
useEffect(() => {
set_imgSrc(src);
}, [src]);
return (
<Image
{...rest}
src={imgSrc}
onLoadingComplete={(result) => {
if (result.naturalWidth === 0) {
// Broken image
set_imgSrc(fallbackSrc);
}
}}
onError={() => {
set_imgSrc(fallbackSrc);
}}
/>
);
}