Установите другое изображение героя в основном макете в соответствии с post/url (получение данных из graphQL) [GATSBY]
Мне нужно изменить основной макет героя-образа моего блога в соответствии с постом / страницей (его слагом).
Каждый пост имеет изображение героя, установленное в информации frontmatter.
Я пробовал все, но:
1. либо он показывает только то же изображение (из моего последнего поста) - это произойдет, если я вспоминаю markdownRemark
без итерации.
2. Или он говорит мне, что мне нужен ключ реквизит (который я уже установил) после итерации с allMarkdownRemark
,
Это моя последняя попытка. Я собрал данные через GraphQl, а затем установил условие (если это домашняя страница, на которой отображается мое основное изображение героя, в противном случае должно отображаться изображение, которое находится в информации frontmatter одного сообщения):
[...]
{location.pathname === '/'
? (<Img fluid={data.file.childImageSharp.fluid} />)
: (({allMarkdownRemark}) => (
allMarkdownRemark.edges.map(({node}) => (
<Img
key={node.frontmatter.slug}
fluid={node.frontmatter.hero.childImageSharp.fluid} />
)
))
)}
[...]
Это весь компонент макета:
import React from "react";
import PropTypes from "prop-types";
import Helmet from "react-helmet";
import { Spring } from 'react-spring/renderprops';
import styled from "styled-components";
import { StaticQuery, graphql } from "gatsby";
import Img from 'gatsby-image';
import Header from "./header";
import Archive from "./archive";
import "./layout.css";
const MainLayout = styled.main`...`;
const Layout = ({ children, location }) => (
<StaticQuery
query={graphql`
query SiteTitleQuery {
site {
siteMetadata {
title
description
}
}
file(relativePath: {regex: "/my-main-img/"}) {
childImageSharp {
fluid (maxWidth: 1900, quality: 90) {
...GatsbyImageSharpFluid_tracedSVG
}
}
}
allMarkdownRemark {
edges {
node {
frontmatter {
slug
hero {
childImageSharp{
fluid(maxWidth: 800, quality: 100) {
...GatsbyImageSharpFluid
}
}
}
}
}
}
}
markdownRemark {
frontmatter {
hero {
childImageSharp {
fluid (maxWidth: 1900, quality: 90) {
...GatsbyImageSharpFluid_tracedSVG
}
}
}
}
}
}
`}
render={data => (
<>
<Helmet [...]>
[...]
</Helmet>
<Header siteTitle={data.site.siteMetadata.title} />
<Spring
from={{ height: location.pathname === '/' ? 150 : 500 }}
to={{ height: location.pathname === '/' ? 500 : 150 }}>
{({ height }) =>
<div style={{ overflow: 'hidden', height }}>
{location.pathname === '/'
? (<Img fluid={data.file.childImageSharp.fluid} />)
: (({allMarkdownRemark}) => (
allMarkdownRemark.edges.map(({node}) =>
(<Img
key={node.frontmatter.slug}
fluid={node.frontmatter.hero.childImageSharp.fluid}/>)
)
))
}
</div>
}
</Spring>
<MainLayout>
<div>{children}</div>
<Archive />
</MainLayout>
</>
)}
/>
);
Layout.propTypes = {
children: PropTypes.node.isRequired
};
export default Layout;
Я следовал за каждым гидом, но все еще не понимаю, чего не хватает. Я новичок, чтобы реагировать и не так хорошо разбираюсь в javascript, извините, если это нубский вопрос.
Заранее благодарю за любую помощь.
1 ответ
<div style={{ overflow: 'hidden', height }}>
{location.pathname === '/'
? (<Img fluid={data.file.childImageSharp.fluid} />)
> : (({allMarkdownRemark}) => (
> allMarkdownRemark.edges.map(({node}) =>
> (<Img
> key={node.frontmatter.slug}
> fluid={node.frontmatter.hero.childImageSharp.fluid}/>)
> )
> ))
}
</div>
Может быть, в этом проблема - в тройке выше вы передаете функцию для ложного условия, даже если над ней не выглядит компонент рендеринга реквизита? Возможно, это должно быть просто
{ location.pathname === '/'
? (<Img ... />)
: (data.allMarkdownRemark.edges.map(({ node }) => ...))
}