GatsbyJS: StatiscQuery 从当前页面传入数据

GatsbyJS: StatiscQuery pass in data from current page

我正在尝试在 GatsbyJS 中以编程方式创建页面。我为我的页面模板制作了一个 herotext 组件。我遇到的问题是静态查询似乎不支持 graphql 变量。如何从我的 GraphQL 查询中的页面获取数据?

我的 GraphQL 查询:

query HeroById($id: String) {
          wpPage(id: { eq: $id }) {
            ACFundersider {
              hero {
                heroText
                heroHeading
              }
            }
            id
          }
        }

变量id: { eq: $id })好像一点作用都没有。我注意到有一个获取 currentPage 的查询,但不太确定我是否可以使用它?

query MyQuery {
  wpPage(ACFundersider: {hero: {heroText: {}}}) {
    allWpPage {
      pageInfo {
        currentPage
      }
    }
  }
}

我的组件与 StaticQuery 看起来像这样:

import React from "react"
import { StaticQuery, graphql } from "gatsby"

export default function HeroText() {
  return (
    <StaticQuery
      query={graphql`
        query HeroById($id: String) {
          wpPage(id: { eq: $id }) {
            ACFundersider {
              hero {
                heroText
                heroHeading
              }
            }
            id
          }
        }
      `}
      render={data => <h2>{data.wpPage.ACFundersider.hero.heroHeading}</h2>}
    />
  )
}

您可以通过节点或边访问您的查询吗?如果你正在使用节点,你可以尝试做这样的事情:

import React from "react"
import { StaticQuery, graphql } from "gatsby"

const query = graphql`
        query HeroById($id: String) {
          wpPage(id: { eq: $id }) {
            ACFundersider {
              hero {
                heroText
                heroHeading
              }
            }
            id
          }
         }
`

export default function HeroText() {
    const data = useStaticQuery(query)
    const { wpPage: { nodes: pages }, } = data
    return (
        <div>
            {
                pages.map(page => {
                    return (
                        <h2>page.ACFundersider.hero.heroHeading</h2>
                    )
                })
            }
        </div>
)}

不确定这个确切的代码是否适合您(您可能需要稍微调整一下)。

staticQuery(或 useStaticQuery 钩子)不接受参数(因此得名,静态),如您在 Gatsby docs 中所见。你的方法永远行不通。

要使用您的 HeroById 查询,您需要使用上下文将 id 传递给页面并使用 page query 而不是静态查询。您的完整代码应如下所示:

import * as React from 'react'
import { graphql } from 'gatsby'

const SomeTemplate= ({data}) => {
  console.log("your data is", data);
  return (
    <div>
     Some content
    </div>
  )
}

export const query = graphql`
        query HeroById($id: String) {
          wpPage(id: { eq: $id }) {
            ACFundersider {
              hero {
                heroText
                heroHeading
              }
            }
            id
          }
        }
      `

export default SomeTemplate

检查 localhost:8000/___graphql 游乐场中的 GraphQL 查询,以确保您的 HeroById 在按 id 过滤时查询 returns 内容(尝试对 id 进行硬编码如果可以的话)。