Как включить компонент карусели в Gatsby с помощью Contentful?

Я хочу включить карусель изображений в свой проект Gatsby. Все изображения будут запрашиваться из Contentful.

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

Кто-нибудь может помочь мне с этим? Кажется, компонент gatsby-image Img не возвращает тег, который может распознать «реагирующая-отзывчивая-карусель». Или вы знаете какую-нибудь другую карусель, которая будет работать?

Мой код:

import React, { Component, Fragment } from "react"

import "react-responsive-carousel/lib/styles/carousel.min.css"
import { Carousel } from "react-responsive-carousel"
import { graphql } from "gatsby"
import Img from "gatsby-image"

import tourimg from "../images/tour-1.jpg"  //Import an image directly

export default class ApartmentPage extends Component {
  render() {
    const photos = this.props.data.allContentfulRooms.edges[0].node.photos
    return (
      <Carousel>
        {photos.map(photo => {
          const { fixed } = photo
          return (
            <div>
              <Img fixed = {fixed} />
              {/* <img src = {tourimg} /> */}
            </div>
          )
        })}
      </Carousel>
    )
  }
}

export const ROOM_QUERY = graphql`
  {
    allContentfulRooms {
      edges {
        node {
          id
          name
          photos {
            fixed(width: 150, height: 150) {
              ...GatsbyContentfulFixed_tracedSVG
            }
          }
        }
      }
    }
  }
`
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

Сообщение об ошибке:

TypeError: Cannot read property 'map' of null
Thumbs.renderItems
node_modules/react-responsive-carousel/lib/components/Thumbs.js:174
  171 | value: function renderItems() {
  172 |     var _this2 = this;
  173 | 
> 174 |     return this.state.images.map(function (img, index) {
  175 |         var itemClass = _cssClasses2.default.ITEM(false, index === _this2.state.selectedItem && _this2.state.hasMount);
  176 | 
  177 |         var thumbProps = {

это сообщение об ошибке выглядит так, как будто оно исходит из другого места, чем код, который вы здесь публикуете?

Derek Nguyen 22.03.2019 06:25
Поведение ключевого слова "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
1
2 259
1

Ответы 1

Ошибка, которую вы видите, связана с компонентом большого пальца react-responsive-carousel. Хотя компонент может обслуживать любой контент в дочерних элементах div, для работы миниатюр требуется тег img. Так как с гэтсби приходится работать с компонентом <Img>, это можно исправить, отключив миниатюры

<Carousel showThumbs = {false} />

Ниже приведен полный рабочий пример (используется Typescript):

import * as React from "react";
import Img from "gatsby-image";
import { graphql, StaticQuery } from "gatsby";

import "react-responsive-carousel/lib/styles/carousel.min.css";
import { Carousel } from "react-responsive-carousel";


interface childImageSharpNode {
  childImageSharp: {
    fluid: any;
  };
}
interface SlideShowComponentProps {
  nodes: childImageSharpNode[];
}

class SlideShowComponent extends React.Component<SlideShowComponentProps> {
  constructor(props: SlideShowComponentProps) {
    super(props);
  }

  render() {
    const images: any[] = [];
    for (const node of this.props.nodes) {
      images.push(
        <div>
          <Img fluid = {node.childImageSharp.fluid} alt = "Image"></Img>
        </div>,
      );
    }

    return (
      <Carousel showThumbs = {false} infiniteLoop = {true} autoPlay = {true}>
        {images}
      </Carousel>
    );
  }
}

interface StaticQueryProps {
  allFile: {
    nodes: childImageSharpNode[];
  };
}

const SlideShow: React.FC = () => (
  <StaticQuery
    query = {graphql`
      query slideshow {
        allFile(filter: { relativePath: { regex: "/slideshow/" } }) {
          nodes {
            childImageSharp {
              fluid(maxWidth: 1024) {
                ...GatsbyImageSharpFluid
              }
            }
          }
        }
      }
    `}
    render = {(data: StaticQueryProps) => <SlideShowComponent nodes = {data.allFile.nodes}></SlideShowComponent>}
  />
);

export default SlideShow;

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