Гэтсби: установить фон изображения с помощью frontmatter, GraphQl и Styled-компонентов.
Я знаю, что эта проблема звучит немного сложно, но это не так.
Я постараюсь объяснить это простым способом:
- Я делаю список сообщений в блоге для домашней страницы моего сайта Gatsby.
Список состоит из "ящиков", каждый ящик, который ссылается на пост, имеет фоновое изображение.
Я передаю это background-image стилевому компоненту, он получает изображение из значения prop, которое я вставил в основной элемент
(вы найдете пример ниже).Это работает нормально, пока я не попробую использовать изображение из моей локальной папки в разделе src (вместо использования онлайн-ссылки, которую я просто поместил на frontmatter).
Вот что я делал в прошлом и работал:
Я поместил URL изображения на frontmatter файла уценки:--- slug: "/post/my-post" [...] imghero: "https:/path/to/image-online.jpg" ---
Затем запросите его с помощью graphql:
const LISTING_QUERY = graphql` query BlogPostListing { allMarkdownRemark(limit: 10, sort: { order: DESC, fields: [frontmatter___date] }) { edges { node { excerpt frontmatter { title slug date(formatString: "MMMM DD, YYYY") imghero } } } } } `
После этого я вставляю {node.frontmatter.imghero} его в подпорку на главном div:
const Listing = () => ( <StaticQuery query={LISTING_QUERY} render={({allMarkdownRemark}) => ( allMarkdownRemark.edges.map(({node}) => ( <Article img_background={node.frontmatter.imghero} key={node.frontmatter.slug}> [... etc ...] </Article> )) )} /> ) export default Listing
И, наконец, я называю эту опору img_background в styled-компоненте:
const Article = styled.article` background-image: url(${props => props.img_background};); [... etc ...] `
Этот метод работает.
Теперь я хочу получить изображение из папки "images", а не из случайного URL.
- Я установил gatsby-mark-images
- Установите его в gatsby-config.js и укажите путь к некоторому изображению в frontmatter.
- Протестируйте все с http://localhost:8000/___graphql (и сработало)
Вставьте дополнительный запрос через graphql:
[...] frontmatter { date(formatString: "DD MMMM, YYYY") title imghero hero { childImageSharp{ fluid(maxWidth: 630) { ...GatsbyImageSharpFluid } } } [...]
Я изменяю узел на компоненте с новым путем:
<Article img_background={node.frontmatter.hero.childImageSharp.fluid} [...]> [...] </Article>
Gatsby Develop компилируется нормально.
Но тогда моя домашняя страница полностью белая.
И консоль браузера говорит, что node.frontmatter.hero является "нулевым". Я не знаю, что еще делать.Спасибо за помощь.
1 ответ
Я думаю, что для решения вашей проблемы требуется немного больше информации, ни одно из перечисленного не выглядит неправильно само по себе. Однако так много людей были сбиты с толку обработкой изображения в Гэтсби, что я пишу контрольный список. Он должен быть общим, но я думаю, что 5, 8, 9, 12 могут помочь вам найти проблему.
Использование изображения с gatsby-transformer-remark
+ gatsby-transformer-sharp
поиск проблемы
Настроить
- Есть ли какая-либо ошибка вообще? Иногда Гэтсби все равно успешно компилируется, несмотря на что-то не так. Проверьте консоль на наличие всего, что... красное.
- Вы перезапустили
gatsby
т.е. включить и выключить снова? Попробуйте удалить кеш и общую папку (.cache
а такжеpublic
) если вы подозреваете, что с ними что-то не так. - Вы перечислили папку с изображениями или любые из ее родительских папок в
gatsby-source-filesystem
? - В вашем frontmatter, путь к изображению относительно самого файла уценки? т.е. путь начинается с точки
./relative/path/to/image.png
- У всех уценок есть
hero
поле в frontmatter? Если файл не имеет поля героя, он будетnull
, - Если путь к изображению в frontmatter не является относительным или не ссылается на файл, он будет рассматриваться как обычная строка.
Запрос и фрагменты
- Ваш запрос работает? Проверьте ваш запрос в http://localhost:8000/___graphql. Убедитесь, что поле изображения отображается как узел файла. Попробуйте что-нибудь простое, например
query {
allMarkdownRemark {
frontmatter {
title
hero {
id
name <-- just enough to know the file exists
}
}
}
}
Если твой hero
отображается как строка, что-то не так, проверьте настройки еще раз.
Вы используете фрагменты? В настоящее время фрагменты не могут быть протестированы в инструменте graphiql, поэтому вам может потребоваться найти определение этого фрагмента и проверить его вручную. Вот список стандартных, которые идут с
gatsby-transformer-sharp
и их определения.Если вы используете нестандартный фрагмент, обязательно определите и экспортируйте его куда-нибудь.
использование
- Если изображение не отображается в браузере, проверьте и попробуйте найти то, что показано вместо вашего изображения.
- Ты используешь
gatsby-image
? Если это так, убедитесь, что вы передаете что-то, с чем он может работать. - Убедитесь, что ваш компонент изображения получает то, что должен. Если ваш компонент ожидает путь, не передавайте объект, как результат фрагмента.
Некоторое примечание стороны
gatsby-remark-images
обрабатывать только относительные ссылки в уценке изображения и HTML<img>
, так что если ваше изображение живет в переднем плане, оно ничего не сделает.