Создание пользовательского компонента с <img> для уценки gatsbyjs

Я пытаюсь создать собственный компонент для моей уценки, который принимает источник изображения. Я не могу отобразить изображение через пользовательский компонент, потому что изображение не найдено, потому что оно не существует.

Я также понял, что путь к изображению генерируется GatsbyJS, и я понятия не имею, как получить путь к изображению в уценке.

У меня есть пользовательский компонент, который содержит некоторый текст, но я не могу сделать то же самое для изображений.

Вот простая уценка с заголовком и несколькими словами.

index.md

---
title: ToDoApp
---

Hi this is my todoapp app. Below is a bunch of screens

<imageholder src='./screen1.png'></imageholder>
![Image from Gyazo](./screen1.png) <!-- it displays... -->

Я создал пользовательский компонент с именем imageholder, где он содержит некоторую логику (в ближайшем будущем...) при отображении изображения.

ImageHolder.js

import React from "react"
   export default class ImageHolder extends React.Component {
   render() {
     return (
       <img src = {this.props.src} alt = "Logo"/>
     )
   }
 }

проект-post.js

const renderAst = new rehypeReact({
  createElement: React.createElement,
  components: {
   "imageholder": ImageHolder
  },
}).Compiler 

И я получил это...

Создание пользовательского компонента с &lt;img&gt; для уценки gatsbyjs

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
0
1 021
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это действительно сложно, поскольку (AFAIK) вы не можете передавать реквизиты из компонента страницы в пользовательский компонент с помощью rehype-react. Я думаю, вам нужно сделать что-то похожее на gatsby-remark-images, который находит пути к изображениям и устанавливает их.

Я написал этот плагин, который имитирует gatsby-remark-images, но для пользовательских компонентов, как в вашем случае.

Вот настройка по умолчанию, вы можете переопределить имя компонента и передать дополнительные параметры преобразования изображения.

// gatsby-config.js
module.exports = {
  plugins: [
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        plugins: [
          {
            resolve: `gatsby-remark-custom-image-component`,
            options: {
              // plugin options
              componentName: 'image-wrapper',
              imagePropName: 'src',
              sharpMethod: 'fluid',
              // fluid's arguments, see gatsby-plugin-sharp docs
              quality: 50,
              maxWidth: 800,
            }
          },
        ],
      },
    },

Затем используйте его в уценке:

<image-wrapper src='./hero.jpg'></image-wrapper>

И получите реквизит изображения в своем пользовательском компоненте.

//src/components/ImageWrapper.js
import React from 'react'

// the result of sharp's image transformation will be passed directly to this component.
// so if you use `fluid` as `sharpMethod`, you'll get
// src, srcSet, base64, aspectRatio, srcSetType, sizes, density, originalImage. 
// Please refer to `gatsby-plugin-sharp` docs.
const ImageWrapper =  ({ src, srcSet }) => <img src = {src} srcSet = {srcSet} />

export { ImageWrapper }

Спасибо, Дерек! Вам было интересно, принимает ли ваш плагин несколько источников изображений? Шикарный плагин кстати

Harrizontal 05.02.2019 07:08

@Harrizontal Я рад, что вы нашли это полезным! Он не принимает несколько источников изображений, но добавить их может быть несложно. Каков ваш вариант использования и какой синтаксис, по вашему мнению, будет выглядеть?

Derek Nguyen 05.02.2019 07:12

Я пытаюсь создать какую-то сетку для изображений - к различному количеству изображений применяется разный стиль сетки - поэтому я считаю, что пользовательский компонент для уценки работает для этого варианта использования. Я также хотел бы поместить некоторый текст рядом с изображением... Я не подходил к встроенным стилям, например, div class='row',etc - как вид начальной загрузки, потому что это может повлиять на читаемость в уценке (вероятно, я мог бы будьте слишком строги в этом...). Я не мог придумать хороший синтаксис, но это может работать правильно..? <image-wrapper src='./hero.jpg' src2='./hero2.jpg'></image-wrapper>

Harrizontal 05.02.2019 07:29

Извините за длинный текст. Я новичок в React и новичок в Гэтсби. Желание может внести свой вклад в ваш проект в ближайшем будущем ...

Harrizontal 05.02.2019 07:30

Попался, я посмотрю, чтобы добавить что-то подобное. Вы также можете проверить мдкс, который позволяет вам писать jsx в md — я действительно не использовал его, но он может быть полезен для того, что вы хотите сделать!

Derek Nguyen 05.02.2019 08:49

Проблема в том, что реквизиты передаются в виде строк для рехайпа — компонент не получает хэш-значение актива, когда уценка обрабатывается и создается Гэтсби. Таким образом, реквизит не совпадает с src тега изображения после создания сайта, и он не находит хэш-файл актива.

Этот подключаемый модуль, Gatsby Remark Копировать связанные файлы, перемещает файлы ресурсов, на которые вы ссылаетесь, в папку public и передает правильно хешированный путь к ресурсам, но по умолчанию только для тегов img, a, аудио и видео (не для пользовательских компонентов).

Чтобы решить эту проблему, переместите плагин из node_modules в папку /plugin в корне проекта и добавьте нужные пользовательские компоненты и свойства в эта линия. В вашем случае это выглядит так:

// Handle a tags.
extractUrlAttributeAndElement($(`a[href]`), `href`).forEach(processUrl)

// Manually added custom tags
extractUrlAttributeAndElement($(`imageholder[src]`), `src`).forEach(processUrl)

Очевидно, это было бы лучше использовать в качестве опции для плагина в блоке конфигурации в gatsby-config, но это сработало для меня в крайнем случае.

Другие вопросы по теме