【问题标题】:Next.js Image component error src missing though I am providing the src prop尽管我提供了 src 道具,但 Next.js 图像组件错误 src 缺失
【发布时间】:2021-10-02 01:49:18
【问题描述】:

我正在向 UserCard 提供 src 道具,但我也收到以下错误。

错误

Unhandled Runtime Error
Error: Image is missing required "src" property. Make sure you pass "src" in props to the `next/image` component. Received: {"width":50,"height":50}

不同文件中的代码如下

在 UserCard.js 中


import Avatar from './Avatar';
import Link from 'next/link';

export default function UserCard({ user, border, onClick }) {
    function handleCloseAll() {
        if (onClick) onClick();
    }
    return (
        <div
            className={`d-flex p-2 align-items-center justify-content-between w-100 ${border}`}>
            <div onClick={handleCloseAll}>
                <Link href={`/profile/${user._id}`}>
                    <a className='d-flex align-items-center text-decoration-none'>
                        <Avatar.Big src={user.avatar} />
                        <div className='ml-1' style={{ transform: 'translateY(-2px)' }}>
                            <span className='d-block'>{user.username}</span>
                            <span
                                style={{
                                    opacity: 0.7
                                }}>
                                {user.fullname}
                            </span>
                        </div>
                    </a>
                </Link>
            </div>
        </div>
    );
}

在 Avatar/Big.js 中

import Image from 'next/image';
import { useSelector } from 'react-redux';
import styles from '../../../styles/avatar.module.css';
export default function Big({ src }) {
    const { darkMode } = useSelector(state => state);
    return (
        <div
            style={{
                filter: darkMode ? 'invert(1) hue-rotate(180deg)' : 'invert(0)'
            }}>
            <Image
                className={styles.avatar}
                width={50}
                height={50}
                src={src}
                alt='Avatar'
            />
        </div>
    );
}

在 Avatar/index.js 中

import Super from './Super';
import Big from './Big';
import Medium from './Medium';
import Small from './Small';
const Avatar = {
    Super: Super,
    Big: Big,
    Medium: Medium,
    Small: Small
};

export default Avatar;

努力

如果我使用本机 &lt;img /&gt;,它会按预期工作


import Avatar from './Avatar';
import Link from 'next/link';

export default function UserCard({ user, border, onClick }) {
    function handleCloseAll() {
        if (onClick) onClick();
    }
    return (
        <div
            className={`d-flex p-2 align-items-center justify-content-between w-100 ${border}`}>
            <div onClick={handleCloseAll}>
                <Link href={`/profile/${user._id}`}>
                    <a className='d-flex align-items-center text-decoration-none'>
                        <img src={user.avatar} />
                        <div className='ml-1' style={{ transform: 'translateY(-2px)' }}>
                            <span className='d-block'>{user.username}</span>
                            <span
                                style={{
                                    opacity: 0.7
                                }}>
                                {user.fullname}
                            </span>
                        </div>
                    </a>
                </Link>
            </div>
        </div>
    );
}

更多详情

我正在使用 Nextjs 版本 11.0.1

Github 存储库链接以获得更多见解:- https://github.com/KUSHAD/dogeshot

【问题讨论】:

    标签: javascript reactjs next.js nextjs-image


    【解决方案1】:

    在 Big.js 中尝试

    { src && (
        <Image 
            className={styles.avatar}
            width={50}
            height={50}
            src={src}
            alt='Avatar'
        />
    )}
    

    仅当 src 有值时才输出图像。

    【讨论】:

    • 请注意,您只能将一个答案标记为已接受。
    • 您只能将一个标记为已接受的答案。如果您在另一个答案上再次单击它,则会将其从另一个答案中删除。您必须决定哪个是您的首选答案。
    【解决方案2】:

    在 Avatar/Big.js 中 您应该使用 src 的初始值。在第一次渲染中,值为 null 添加此代码:

    import Image from 'next/image';
    import {useState,useEffect} from 'react';
    import { useSelector } from 'react-redux';
    import styles from '../../../styles/avatar.module.css';
    export default function Big({ src }) {
    const [image,setImage] = useState("/defaultImage")
    useEffect(()=>{
    if(src){
    setImage(src)
    }
    },[src])
        const { darkMode } = useSelector(state => state);
        return (
            <div
                style={{
                    filter: darkMode ? 'invert(1) hue-rotate(180deg)' : 'invert(0)'
                }}>
                <Image
                    className={styles.avatar}
                    width={50}
                    height={50}
                    src={image}
                    alt='Avatar'
                />
            </div>
        );
    }
    

    【讨论】:

    • 这也可以按预期工作,但我会选择第一个答案,因为它非常简洁。不过还是谢谢
    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多