重构 Gatsby 图像查询

Posted

技术标签:

【中文标题】重构 Gatsby 图像查询【英文标题】:Refactor Gatsby Image Query 【发布时间】:2019-11-26 11:11:46 【问题描述】:

我目前在我的 IndexPage 组件中使用 Gatsby 和 gatsby-image。我希望将以下代码重构为单个 React 组件,因为存在不必要的重复:

          ...
          return (
          <div>
            <h1>Startups</h1>
            <p>Copy</p>
            <Img fluid=props.data.imageOne.childImageSharp.fluid/>
          </div>
          <div>
            <h1>People</h1>
            <p>Copy</p>
            <Img fluid=props.data.imageTwo.childImageSharp.fluid/>
          </div>
          <div>
            <h1>Data</h1>
            <p>Copy</p>
            <Img fluid=props.data.imageThree.childImageSharp.fluid/>
          </div>
        </div>
        )

export const fluidImage = graphql`
fragment fluidImage on File 
  childImageSharp 
    fluid(maxWidth: 1000) 
      ...GatsbyImageSharpFluid
    
  

`

export const pageQuery = graphql`
  query 
    imageOne: file(relativePath:  eq: "igemA.png" ) 
      ...fluidImage
    
    imageTwo: file(relativePath:  eq: "inephemeraA.png" ) 
      ...fluidImage
    
    imageThree: file(relativePath:  eq: "polypA.png" ) 
      ...fluidImage
    
  

类似于这样的:

const NewComponent = (props) => (
          <div>
            <h1>props.heading</h1>
            <p>props.body</p>
            <Img fluid=props.data.[props.image].childImageSharp.fluid/>
          </div>

)

如何更改 graphql 查询,以便我可以根据传递给 NewComponent 的道具渲染图像?

【问题讨论】:

与您现在修改查询的方式相同吗? developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 【参考方案1】:

除非我有误解,否则我认为您无需更改查询即可完成此操作。只需将每个查询的结果作为道具传递给您的子组件。

// components/newComponent.js

import React from "react"
import Img from "gatsby-image"

const NewComponent = ( image, heading, body ) => (
  <>
    <h1> heading </h1>
    <p> body </p>
    <Img fluid= image.childImageSharp.fluid  />
  </>
)

export default NewComponent

// index.js

import React from "react"
import graphql from "gatsby"

import NewComponent from "../components/newComponent"

const IndexPage = ( data ) => 
  const  imageOne, imageTwo  = data
  return (
  <>
    <NewComponent image= imageOne  heading="heading 1" body="body 1" />
    <NewComponent image= imageTwo  heading="heading 1" body="body 2" />
  </>
)

export default IndexPage

export const fluidImage = graphql`
fragment fluidImage on File 
  childImageSharp 
    fluid(maxWidth: 1000) 
      ...GatsbyImageSharpFluid
    
  

`

export const pageQuery = graphql`
  query 
    imageOne: file(relativePath:  eq: "gatsby-astronaut.png" ) 
      ...fluidImage
    
    imageTwo: file(relativePath:  eq: "gatsby-icon.png" ) 
      ...fluidImage
    
  
`

这是一个CodeSandbox 来测试上述内容。

【讨论】:

【参考方案2】:

您可以像这样将变量传递给 GraphQL 查询:

export const pageQuery = graphql`
  query image($src: String!) file(relativePath:  eq: $src ) 
      ...fluidImage
    `

这是一个如何Pass Variable的示例

【讨论】:

以上是关于重构 Gatsby 图像查询的主要内容,如果未能解决你的问题,请参考以下文章

高光谱图像重构常用评价指标及其Python实现

PCL系列——三维重构之泊松重构

深度原理与框架-图像超分辨重构-tensorlayer

图像超分辨率重构实战

ruby 图像模糊挑战的重构代码(包括曼哈顿距离)

PCA图像数据降维及重构误差分析实战并使用TSNE进行异常数据可视化分析