gpt4 book ai didi

javascript - 使用 React 和 Gatsby 将 Prop 从 parent 传递给 child

转载 作者:行者123 更新时间:2023-11-30 09:17:26 26 4
gpt4 key购买 nike

这里是 Gatsby 新手,请耐心等待。我正在使用 Gatsby 和 React 构建一个非常基本的博客应用程序。我有一个登陆页面,其中有一个部分显示最新发布的 3 篇博文。到目前为止,我的 index.js 文件中的以下代码一切正常:

import React from 'react'
import { Link, graphql } from 'gatsby'
import get from 'lodash/get'

import Bio from '../components/Bio'
import Layout from '../components/Layout'
import SEO from '../components/SEO'
import { formatReadingTime } from '../utils/helpers'

class BlogIndex extends React.Component {
render() {
const siteTitle = get(this, 'props.data.site.siteMetadata.title')
const siteDescription = get(
this,
'props.data.site.siteMetadata.description'
)
const size = 3
const posts = get(this, 'props.data.allMarkdownRemark.edges')

return (
<div className="container">
<Layout location={this.props.location} title={siteTitle}>
<SEO />
<Bio />
<section>
<div>
{posts.slice(0, size).map(({ node }) => {
const title = get(node, 'frontmatter.title') || node.fields.slug
return (
<div key={node.fields.slug}>
<h3>
<Link to={node.fields.slug}>
{title}
</Link>
</h3>
<p>
{node.frontmatter.date}
{` • ${formatReadingTime(node.timeToRead)}`}
</p>
<p
dangerouslySetInnerHTML={{ __html: node.frontmatter.spoiler }}
/>
</div>
)
})}
</div>
</section>
</Layout>
</div>
)
}
}

export default BlogIndex

export const pageQuery = graphql`
query {
site {
siteMetadata {
title
description
}
}
allMarkdownRemark(sort: { fields: [frontmatter___date], order: DESC }) {
edges {
node {
fields {
slug
}
timeToRead
frontmatter {
date(formatString: "MMMM DD, YYYY")
title
spoiler
}
}
}
}
}
`

但是,我想将最新的博客文章部分分成一个单独的组件(例如 LatestBlogPosts.js)并将其导入到我的 index.js 文件中。因此,我将标记复制到一个单独的文件中,将该文件导入到我的 index.js 中,突然出现一条错误消息:

TypeError: Cannot read property 'slice' of undefined

我从新创建的文件中检查并记录了 posts 也返回了 undefinedLatestBlogPosts.js 文件如下所示:

import React from 'react'
import { Link } from 'gatsby'
import {formatReadingTime} from "../utils/helpers";
import get from 'lodash/get'

class LatestBlogPosts extends React.Component {
render() {
const size = 3
const posts = get(this, 'props.data.allMarkdownRemark.edges')

return (
<section>
<div>
{posts.slice(0, size).map(({ node }) => {
const title = get(node, 'frontmatter.title') || node.fields.slug
return (
<div key={node.fields.slug}>
<h3>
<Link to={node.fields.slug}>
{title}
</Link>
</h3>
<p>
{node.frontmatter.date}
{` • ${formatReadingTime(node.timeToRead)}`}
</p>
<p
dangerouslySetInnerHTML={{ __html: node.frontmatter.spoiler }}
/>
</div>
)
})}
</div>
</section>
)
}
}

export default LatestBlogPosts

修改后的 index.js 如下所示:

import React from 'react'
import { Link, graphql } from 'gatsby'
import get from 'lodash/get'

import Bio from '../components/Bio'
import Layout from '../components/Layout'
import SEO from '../components/SEO'
import Footer from '../components/Footer'
import { formatReadingTime } from '../utils/helpers'
import { rhythm } from '../utils/typography'
import LatestBlogPosts from "../components/LatestBlogPosts";

class BlogIndex extends React.Component {
render() {
const siteTitle = get(this, 'props.data.site.siteMetadata.title')
const siteDescription = get(
this,
'props.data.site.siteMetadata.description'
)

return (
<div className="container-fluid">
<Layout location={this.props.location} title={siteTitle}>
<SEO />
<Bio />
<LatestBlogPosts />
<Footer />
</Layout>
</div>
)
}
}

export default BlogIndex

export const pageQuery = graphql`
query {
site {
siteMetadata {
title
description
}
}
allMarkdownRemark(sort: { fields: [frontmatter___date], order: DESC }) {
edges {
node {
fields {
slug
}
timeToRead
frontmatter {
date(formatString: "MMMM DD, YYYY")
title
spoiler
}
}
}
}
}
`

我似乎无法理解为什么 postsLatestBlogPosts.js 文件中返回 undefined

最佳答案

问题出在这个表达式上:

posts = get(this, 'props.data.allMarkdownRemark.edges')

在您的第一个示例中,this 指向BlogIndex;在第二个示例中,您已将表达式移动到 LatestBlogPostsrender() 方法,因此表达式将查找该组件上的数据。

您需要将帖子作为 Prop 传递给子组件:

<LatestBlogPosts posts={posts} />

并在 child 的渲染方法中引用它:

{this.props.posts.slice(...

关于javascript - 使用 React 和 Gatsby 将 Prop 从 parent 传递给 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54061767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com