javascript - 在 NextJS 中拥有后备图像的最佳方法是什么?

标签 javascript reactjs next.js youtube-api nextjs-image

最近,我一直在 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 处理此问题的最佳方法是什么? ?

最佳答案

您可以创建自定义图像组件来扩展内置 next/image如果图像加载失败,通过触发 onError 添加回退逻辑打回来。

import React, { useState } from 'react';
import Image from 'next/image';

const ImageWithFallback = (props) => {
    const { src, fallbackSrc, ...rest } = props;
    const [imgSrc, setImgSrc] = useState(src);

    return (
        <Image
            {...rest}
            src={imgSrc}
            onError={() => {
                setImgSrc(fallbackSrc);
            }}
        />
    );
};

export default ImageWithFallback;
然后,您可以直接使用自定义组件而不是next/image如下:
<ImageWithFallback
    key={videoId}
    layout="fill"
    src={`https://i.ytimg.com/vi/${videoId}/maxresdefault.jpg`}
    fallbackSrc={`https://i.ytimg.com/vi/${videoId}/hqdefault.jpg`}
/>
通过 keyvideoId 上触发重新渲染的 Prop 改变。

关于javascript - 在 NextJS 中拥有后备图像的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66949606/

相关文章:

javascript - 如何使用 PhoneGap/Cordova 在本地缓存图像文件?

css - 简单的 Material UI 对话框示例有不需要的滚动条

reactjs - react、next.js、gatsby.js - 在深入研究 next.js 或 gatsby.js 之前,是否需要先学习 react?

javascript - Facebook 调试器不拾取 Next.js 的 next-seo 元标记

javascript - 只计算给定类(class)的 child

Javascript解析int

javascript - 如何在AJAX中成功执行两个功能(关闭和保存)?

javascript - 我可以使用 useRef 钩子(Hook)来清空输入值吗?

node.js - Mocha 测试 "0 passing"

node.js - 为什么导入 bcrypt 会导致 "Cannot find module napi-v3/bcrypt_lib.node"错误?