【问题标题】:How to pass data from GraphQL when in a React Component在 React 组件中如何从 GraphQL 传递数据
【发布时间】:2019-09-24 05:43:00
【问题描述】:

我有一个 Billboard 组件,它像这样导入到我的主页上:

<Billboard id="successful_network_ebook_billboard"/>

组件的内容是:

import React, {Component} from "react";
import T from 'i18n-react'
import Link from "../components/LocalizedLink";
import Tank from "../components/Tank";
import CTA from "../components/CTA";
import Img from "gatsby-image"
import {graphql} from "gatsby"

import "../styles/css/components/Billboard.css";

class Billboard extends Component {
    successful_network_ebook_billboard = () => {
        return (
            <section id={this.props.id} className="Billboard">
                <Img className="bg" fluid={this.props.data.bgNetwork.childImageSharp.fluid} alt={this.props.alt}/>
                <Tank className="content">
                    <div className="text">
                        <h3>Title</h3>
                        <p>Paragraph</p>
                        <CTA to="/page">Click here</CTA>
                    </div>
                </Tank>
            </section>
        )
    }

    render() {
        switch (this.props.id) {
            /* There are more cases */
            case "successful_network_ebook_billboard":
                return (this.successful_network_ebook_billboard());
            default:
                return (
                    <div></div>
                )
        }
    }
}

export default Billboard

require("../queries/fragment.headers");

export const queryBillboardImages = graphql `
    query BillboardImages {
        bgNetwork: file(relativePath: { eq: "assets/images/healthcare/banner_soc2_bg.jpg" }) {
            ...fluidHeader
        }
    }
`

当我运行代码时,一切都正常加载,除了我试图通过 GraphQL 加载的图像。我收到消息:

(Billboard, ) TypeError: Cannot read property 'bgNetwork' of undefined

显然“数据”是空的,但我想我正在使用到处都建议的语法。

我尝试获取 this.data 而不是 this.props.data ;我得到同样的错误。

我尝试将组件转换为 const,这似乎提供了更“直接”的语法,但我得到了一个不同的、更深奥的错误。

我想知道如何将 GrphQL 调用的结果传递给我的组件。当我在页面上执行此操作时,就像将 this.props.data 解构为常量一样简单,然后就可以使用了。但是在组件内部时,它似乎并没有那样工作。

如果我这样做

console.log(data)

它返回给我的只是来自父级的 idalt 道具。

感谢您的帮助!

【问题讨论】:

    标签: reactjs graphql gatsby


    【解决方案1】:

    graphql query 只能用于页面而不是所有组件。对于组件,您需要使用StaticQuery 组件或useStaticQuery 和最新版本的react

    export default (props) => (
      <StaticQuery
        query={graphql `
          query BillboardImages {
            bgNetwork: file(relativePath: { eq: "assets/images/healthcare/banner_soc2_bg.jpg" }) {
                ...fluidHeader
            }
        }
      `}
        render={data => (
          <Billboard  {...props} data={data}/>
        )}
      />
    );
    

    或使用useStaticQuery

    export default (props) => {
      const data = useStaticQuery(graphql `
          query BillboardImages {
            bgNetwork: file(relativePath: { eq: "assets/images/healthcare/banner_soc2_bg.jpg" }) {
                ...fluidHeader
            }
        }
      `)
    
      return (
        <Billboard  {...props} data={data}/>
      )
    }
    

    【讨论】:

    • 好的,事情就是这样,如果我做错了,请告诉我。我的页面已经有一个 GraphQL 请求,我用它来获取不属于任何组件的图像。所以我不一定要将整个数据对象传递给孩子(如果我错了,请纠正我,如果你建议的方法?)理想情况下,Billboard 组件只会接收一个 ID,并且是能够从那里推断它需要从它自己的 GraphQL 请求中使用什么图像。您的代码仍然适用吗?
    • @LeKevoid ,我的建议是您不能像为组件编写那样进行查询。对于 Billboard 组件,您需要使用StaticQuery 来运行您喜欢的任何查询。我的建议是不要将 Billboard 导出为默认值,而不是导出调用 StaticQuery 并将结果返回给 Billboard 的组件
    • 谢谢! 元素具有 query={} 的“输入”,其中包含您要运行的 GraphQL 查询,并返回 render={(data} => ()}。这对我有用。非常感谢您的帮助!
    • 很高兴有帮助:-)
    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 2018-11-27
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多