Целевой фрагмент в пределах реакции
Я создаю свой первый реагирующий сайт, используя gatsby с prismic.io в качестве CMS для моего раздела новостей.
В рамках призмы я использую фрагменты для цитат и рекомендуемых изображений в каждой из новостных историй и пытаюсь вытащить эти данные на свою страницу, однако я не уверен, как настроить таргетинг на конкретные имена фрагментов, которые я создал в соответствующих const
это было установлено для каждого.
GraphQL Query
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
Поскольку срезы не являются обязательными в рамках призмы, я сталкиваюсь с проблемами в некоторых новостях, когда featured_image
добавляется перед quote
заставляя их менять порядок внутри body
,
Вопрос
Есть ли способ в каждом const
нацелиться на определенный фрагмент или есть лучший способ для меня это сделать?
2 ответа
Посмотрев и изучив немного больше знаний с @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} />
или же
<QuoteText>{body.PrismicNewsStoryBodyQuote.quote.text}</QuoteText>
//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
или используйте уменьшить
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
>