0

I created a project using NextJS template Blog starter kit, found here: https://vercel.com/templates/next.js/blog-starter-kit

I've successfully fetched my own posts from a graphql-endpoint and can render them, but when I add values to the post object on my own that weren't included in the original NextJS-project and pass them down to child components, they are available at first but then go undefined and throw an error if I try to use those values.

Please see below code and screenshot of how the values goes from defined to undefined.

I'm new to both Typescript and NextJS but have used React for some time, but I can't grasp why this happens. The code below renders, but I'd like to understand why just some of the props goes undefined, after clearly being included. Also in this specific example I'd like to be able to use coverImage.width in the Image component width-property instead of hardcoding a value.

index.tsx

type Props = {
    allPosts: Post[]
}

export default function Index({ allPosts }: Props) {
    const heroPost = allPosts[0]
    const morePosts = allPosts.slice(1)
    
    return (
        <>
            <Layout>
                <Head>
                    <title>SWG - Blog</title>
                </Head>
                <Container>
                    <Intro />
                    {heroPost && (
                        <HeroPost heroPost={heroPost} />
                    )}
                    {morePosts.length > 0 && <MoreStories posts={morePosts} />}
                </Container>
            </Layout>
        </>
    )
}

export const getStaticProps = async () => {
    const allPosts = (await getPosts()) || [];

    return {
        props: { allPosts },
    }
}

hero-post.tsx. All heroPost-prop values are available here. Please see below image of console print as well (image link until I have 10 points on SO).

type Props = {
    heroPost: {
        title: string
        coverImage: {
            url: string
            width: number
            height: number
        }
        date: string
        excerpt: string
        author: Author
        slug: string
    }
}

const HeroPost = ({ heroPost }: Props) => {

    return (
        <section>
            <div className="mb-8 md:mb-16">
                <CoverImage title={heroPost.title} src={heroPost.coverImage.url} slug={heroPost.slug} coverImage={heroPost.coverImage} />
            </div>
            <div className="md:grid md:grid-cols-2 md:gap-x-16 lg:gap-x-8 mb-20 md:mb-28">
                <div>
                    <h3 className="mb-4 text-4xl lg:text-5xl leading-tight">
                        <Link as={`/posts/${heroPost.slug}`} href="/posts/[slug]">
                            <a className="hover:underline">{heroPost.title}</a>
                        </Link>
                    </h3>
                    <div className="mb-4 md:mb-0 text-lg">
                        <DateFormatter dateString={heroPost.date} />
                    </div>
                </div>
                <div>
                    <p className="text-lg leading-relaxed mb-4">{heroPost.excerpt}</p>
                    <Avatar name={heroPost.author.name} picture={heroPost.author.picture} />
                </div>
            </div>
        </section>
    )
}

export default HeroPost

cover-image.tsx. Here's where the props of heroPost goes missing, but only the ones I've declared. Not "src" for example.

type Props = {
    title: string
    src: string
    slug?: string
    coverImage: {
        url: string
        width: number
        height: number
    }
}

const CoverImage = ({ title, src, slug, coverImage }: Props) => {
    console.log(src);
    //console.log(title);
    console.log(coverImage);

    const image = (
        <>
            <Image src={src} width={1495} height={841} />
        </>
    )
    return (
        <div className="sm:mx-0">
            {slug ? (
                <Link as={`/posts/${slug}`} href="/posts/[slug]">
                    <a aria-label={title}>{image}</a>
                </Link>
            ) : (
                image
            )}
        </div>
    )
}

export default CoverImage

Apparently I can't post images since I'm a new member, but the above console.logs prints like this:

coverImage object exists

prop.src = correct src.value

props.coverImage = cover-image.tsx?0fdc:19 full coverImage object printed

Don't know where these react-devtools-backend lines come from but same thing here, both values exist.

react_devtools_backend.js:4082 correct src.value

react_devtools_backend.js:4082 full coverImage object printed

coverImage then goes undefined

cover-image.tsx?0fdc:19 undefined

but src in props still return its value

cover-image.tsx?0fdc:17 correct src.value

cover-image.tsx?0fdc:19 undefined

same thing with the lines from react_devtools_backend:

react_devtools_backend.js:4082 correct src.value

react_devtools_backend.js:4082 undefined

I've read numerous SO-threads and looked through the NextJS-docs but fail to realise what I'm doing wrong.

console.log of heroPost-object in hero-post component.

eriksson
  • 1
  • 1

0 Answers0