【问题标题】:Target fragment within react constreact const中的目标片段
【发布时间】:2019-06-09 00:51:47
【问题描述】:

我正在构建我的第一个 react 网站,使用 gatsby 和 prismic.io 作为我的新闻部分的 CMS。

在 prismic 中,我在每个新闻报道中使用切片作为引用和特色图片,并希望尝试将这些数据提取到我的页面中,但是我不确定如何定位我在已为每个设置的相关const

GraphQL 查询

export const query = graphql`
query ($slug:String){
prismicNewsStory (uid:{eq: $slug}) {
                data {
                body {
                    __typename
                    ... on PrismicNewsStoryBodyQuote {
                        primary {
                            quote {
                                text
                            }
                        }
                    }

                    ... on PrismicNewsStoryBodyFeaturedImage {
                        primary {
                            featured_image {
                                url
                            }
                        }
                    }
                }

            }
        }
    }
`

定位常量

const quote = props.data.prismicNewsStory.data.body[0].primary.quote.text
const featured_image = props.data.prismicNewsStory.data.body[1].primary.featured_image.url

由于切片在 prismic 中是可选的,当在 quote 之前添加 featured_image 时,我遇到了一些新闻报道的问题,使它们在 body 内交换顺序。

问题

每个const 中是否有针对特定片段的方法,或者我有更好的方法吗?

【问题讨论】:

    标签: javascript reactjs constants gatsby prismic.io


    【解决方案1】:

    在通过@paul-mcbride 了解并学习更多知识后,我们提出了以下解决方案来针对任何__typename

    const body = props.data.prismicNewsStory.data.body.reduce((object, item) => ({
            ...object,
            [item.__typename]: item.primary
        }), {});
    

    您现在可以使用目标切片名称。

    <FeaturedImage src={body.PrismicNewsStoryBodyFeaturedImage.featured_image.url} />
    

    &lt;QuoteText&gt;{body.PrismicNewsStoryBodyQuote.quote.text}&lt;/QuoteText&gt;

    【讨论】:

      【解决方案2】:

      //get the array
      const body = props.data.prismicNewsStory.data.body;
      
      const {feature_image : fi0, quote: q0} = body[0].primary;
      // above line is equivalent to:
      //  const fi0 = body[0].primary.feature_image;
      //  const q0 = body[0].primary.quote;
      // when order is reversed q0 will be undefined 
      
      const {feature_image : fi = fi0, quote : q = q0} = body[1].primary;
      // above line is equivalent to:
      //  const fi = body[1].primary.feature_image || fi0;
      //  const q = body[1].primary.quote || q0;
      // when order is reversed fi0 will be assigned to fi
      
      const feature_image = fi.url;
      const quote = q.text

      或者使用reduce

      const reduceStory = (acc, item) => ({
        feature_image: acc.feature_image|| item.primary.feature_image,
        quote: acc.quote || item.primary.quote
      })
      const story = props.data.prismicNewsStory.data.body.reduce(reduceStory, {});
      
      const feature_image = story.feature_image.url;
      const quote = story.quote.text
      

      >

      【讨论】:

      • 谢谢@mke - 第一个答案确实有效,但是由于项目是动态输入的,当项目顺序相反时它不起作用。减少对我有用,但我不得不稍微调整一下,以便我可以定位 __typename
      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 2020-05-21
      • 1970-01-01
      • 2011-07-13
      • 2017-10-08
      • 2023-02-24
      • 2015-01-24
      • 1970-01-01
      相关资源
      最近更新 更多