如何在内容丰富的 Gatsby 中包含轮播组件?

Posted

技术标签:

【中文标题】如何在内容丰富的 Gatsby 中包含轮播组件?【英文标题】:How to include a carousel component in Gatsby with Contentful? 【发布时间】:2019-08-07 01:45:18 【问题描述】:

我想在我的 Gatsby 项目中包含一个图像轮播。所有图像都将从 Contentful 查询。

我使用了“react-responsive-carousel”并设法使其与直接导入图像一起工作。我也确信我可以成功提取内容图像,而无需将其放入轮播组件中。

谁能帮我解决这个问题?似乎 gatsby-image 组件 Img 没有返回“react-reponsive-carousel”可以识别的标签。或者你知道任何其他可以工作的旋转木马吗?

我的代码:

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 = 

【问题讨论】:

该错误消息看起来与您在此处共享的代码来自不同的地方? 【参考方案1】:

您看到的错误来自react-responsive-carousel 的拇指组件。尽管该组件可以满足子 div 中的任何内容,但是,要使缩略图起作用,它需要一个 img 标签。由于使用 gatsby 您必须使用 &lt;Img&gt; 组件,您可以通过禁用缩略图来解决此问题

&lt;Carousel showThumbs=false /&gt;

以下是一个完整的工作示例(使用 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 ></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;

【讨论】:

以上是关于如何在内容丰富的 Gatsby 中包含轮播组件?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript动画:offset和匀速动画详解(含轮播图的实现)

GraphQL - Gatsby.js- React 组件。 - 如何查询变量/参数?

Gatsby 的 GraphQL 查询 - 具有灵活内容模型的内容设置

如何在 Gatsby 中对 GraphQL 查询进行单元测试

如何在 Gatsby 网站中添加引导 js

如何在 Gatsby 的模板组件中访问上下文变量?