最近,我一直在NextJS中工作,该项目使用YoutubeAPI获取视频信息,包括缩略图URL。
全分辨率图像的缩略图URL如下所示:https://i.ytimg.com/vi/${videoId}/maxresdefault.jpg
然而,有时YouTube无法生成全分辨率图像,在这种情况下,图像不会显示在我的网页上。
如果带有URL https://i.ytimg.com/vi/${videoId}/maxresdefault.jpg
的图像不存在,我希望使用另一个URL,如https://i.ytimg.com/vi/${videoId}/hqdefault.jpg
使用next/image
处理此问题的最佳方法是什么?
6条答案
按热度按时间dy1byipe1#
您可以创建一个自定义映像组件,该组件扩展内置的
next/image
,并在映像加载失败时通过触发onError
回调添加回退逻辑。然后,您可以直接使用自定义组件而不是
next/image
,如下所示:传递
key
属性以触发videoId
更改时的重新呈现。qjp7pelc2#
这些答案很有帮助,但是有一种方法可以实现这一点,而不需要每次都传递
key
,方法是利用useEffect
钩子:此外,
onError
事件似乎不会对某些图像触发(我相信layout='fill'
在某些情况下不会触发它),对于这些情况,我一直使用onLoadingComplete
,然后检查图像的宽度是否为0完整代码:
clj7thdc3#
@juliomalves已经给出了99%的答案,但是我想补充一下。在他的解决方案中更改src时有一个问题,因为图像不会更新,因为它得到的imgSrc值没有更新。这是我对他的回答的补充:
现在,imgSrc仅用作标志,并且跟踪src值,这有助于更改图像,即使您的图像之前已启用备用图像。
3npbholx4#
有@juliomalves解决方案与typescript
ut6juiuv5#
上面的解决方案对我都不起作用。但是,当我使用“onErrorCapture”而不是“onError”时,它起作用了!=)
vlf7wbxs6#
这是我尝试用
<Avatar.Image>
和<Avatar.Fallback>
子组件构建一个<Avatar>
父组件。首先,我构建了
<Avatar.Image>
组件来显示我们的头像图像。一旦
AvatarImage
组件加载失败,我就让AvatarFallback
组件填充背景。父组件名为
Avatar
下面是我如何使用它的一个例子:(不要忘记修改
${videoId}
)