用React Slick创建一个旋转木马

2,041 阅读5分钟

将旋转木马集成到我们的网络应用中的需求经常出现。旋转木马是在一个空间中显示多个项目的UI组件。

它们是网页上最有美感的组件之一,但往往被证明很难从头开始创建,特别是在React这样的框架中。

React Slick是一个用于创建旋转木马的伟大库。它提供了可访问性和响应性--以及其他功能--来帮助你创建高性能的旋转木马。在这篇文章中,你将学习如何用React Slick创建一个简单的旋转木马组件,并探索它的一些主要功能。

前提条件

要继续学习,你应该对以下内容有一个基本的了解

  • React
  • ES6(传播运算符,可选链式)。

设置项目

在本教程中,我们将创建一个旋转木马视图,显示酒店的可用房间。

打开你的终端,运行以下命令来安装React。

npx create-react-app react-carousel

接下来移动到react-carousel目录。

cd react-carousel

并安装以下依赖项。

npm install react-slick slick-carousel react-icons

React Slick是为我们提供旋转木马组件的主要库。slick-carousel为这个组件提供样式,而react-icons将被用来导入图标。

这个应用程序的所有样式都位于源代码中的src/index.css 。查看实时项目

创建旋转木马组件

从根目录中,创建路径components/Carousel.js ,并将这个组件导入到App.js

//App.js
import Carousel from "../components/Carousel";

export default function App() {
  return <Carousel />;
}

通常情况下,旋转木马的每个项目所显示的内容是相似的。因此,我们可以将这些内容存储在一个数组中,就像这样。

// Carousel.js
import 'slick-carousel/slick/slick.css'
import 'slick-carousel/slick/slick-theme.css'

export default function Carousel() {
  const hotelCards = [
    {
      imageSrc:
        'https://images.unsplash.com/photo-1559508551-44bff1de756b?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=387&q=80',
      title: 'Studio Room',
      description: 'Lorem ipsum dolor sit amet, consectur dolori',
      pricingText: 'USD 50/Day',
      features: ['Free Wifi', 'Free breakfast'],
    },
    {
      imageSrc:
        'https://images.unsplash.com/photo-1616940844649-535215ae4eb1?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=387&q=80',
      title: 'Deluxe Room',
      description: 'Lorem ipsum dolor sit amet, consectur dolori',
      pricingText: 'USD 80/Day',
      features: ['Free Wifi', 'Free breakfast'],
    },
    {
      imageSrc:
        'https://images.unsplash.com/photo-1599619351208-3e6c839d6828?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=872&q=80',
      title: 'King Deluxe Room',
      description: 'Lorem ipsum dolor sit amet, consectur dolori',
      pricingText: 'USD 150/Day',
      features: ['Free Wifi', 'Free breakfast', 'Discounted Meals'],
    },
    {
      imageSrc:
        'https://images.unsplash.com/photo-1461092746677-7b4afb1178f6?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=774&q=80',
      title: 'Royal Suite',
      description: 'Lorem ipsum dolor sit amet, consectur dolori',
      pricingText: 'USD 299/Day',
      features: [
        'Free Wifi',
        'Free breakfast',
        'Discounted Meals',
        "MacBook for work use (hotel's property)",
      ],
    },
  ]

  return (
    <div className='content'></div>
  )
}

注意我还在组件的顶部从slick-carousel导入了两个样式表。

使用Slider 和配置Slider 设置

有了我们需要的内容,让我们开始绘制旋转木马组件的结构图。React Slick有一个Slider 组件,负责显示旋转木马。

// Carousel.js
import Slider from 'react-slick'

import 'slick-carousel/slick/slick.css'
import 'slick-carousel/slick/slick-theme.css'

export default function Carousel() {

  const sliderSettings = {
    slidesToShow: 3,
    slidesToScroll: 1,
    infinite: false,
  }

  const hotelCards = [
    // ...
  ]

  return (
    <div className='content'>
      <Slider {...sliderSettings}>
        {hotelCards.map((card, index) => (
          <div key={index}>
            <h2>{card.title}</h2>
            <img alt={card.title} src={card.imageSrc} width="100" height="100" />
            <p>{card.description}</p>
            <ul>
              {card.features.map((feature, index) => (
                <li key={index}>{feature}</li>
              ))}
            </ul>
            <button className='btn'>Buy Now</button>
          </div>
        ))}
      </Slider>
    </div>
  )
}

在上面的代码块中,我们已经创建了一个sliderSettings 变量来存储旋转木马的设置。然后我们把这个对象扩散到Slider 组件中。

sliderSettings 到目前为止有三个配置。

  • slidesToShow - 数字来决定保持浏览的幻灯片数量
  • slidesToScroll - 数字,确定导航旋转木马时要移动的幻灯片的数量
  • infinite - 布尔值(Boolean),确定当到达最后一个项目时,旋转木马是否继续循环。

在这一点上,最终的结果应该是这样的。

React Slick Carousel

N.B. React Slick有更多的旋转木马配置,我们马上就会讨论。

自定义下一个上一个按钮

React Slick给出的默认控制按钮可以完成工作,但可能无法通过UI测试。

因此,让我们创建我们自己的自定义按钮,并使用React Slick的API来使它们发挥作用。我们将从删除按钮开始。

// Carousel.js
import {useState} from 'react'
import Slider from 'react-slick'
import {FaChevronLeft, FaChevronRight} from 'react-icons'

import 'slick-carousel/slick/slick.css'
import 'slick-carousel/slick/slick-theme.css'

export default function Carousel() {
  const [sliderRef, setSliderRef] = useState(null)

  const sliderSettings = {
    // removes default buttons
    arrows: false,
    slidesToShow: 3,
    slidesToScroll: 1,
    infinite: false,
  }

  const hotelCards = [
    // ...
  ]

  return (
    <div className='content'>
      <div className='controls'>
        <button>
          <FaChevronLeft />
        </button>
        <button>
          <FaChevronRight />
        </button>
      </div>
      <Slider ref={setSliderRef} {...sliderSettings}>
        {pricingCards.map((card, index) => (
          <div key={index}>
            <h2>{card.title}</h2>
            <p>{card.description}</p>
            <ul>
              {card.features.map((feature, index) => (
                <li key={index}>{feature}</li>
              ))}
            </ul>
            <button>Buy Now</button>
          </div>
        ))}
      </Slider>
    </div>
  )
}

为了能够访问React Slick的API,我们必须将Slider 的实例存储在一个变量(state)中,方法是将Slider 的ref值链接到state--其初始值被设置为null 。当组件渲染时,我们可以通过这个状态访问API。

我们想从API中使用的两个函数是slickPrevslickNext ,它们分别按照slidesToScroll 中指定的数字来前后移动旋转木马。在按钮上应用这个,我们的返回函数应该是这样的。

return (
    <div className='content'>
      <button onCLick={sliderRef?.slickPrev}>
        <FaChevronLeft />
      </button>
      <button onCLick={sliderRef?.slickNext}>
        <FaChevronRight />
      </button>
      <Slider ref={setSliderRef} {...sliderSettings}>
        {pricingCards.map((card, index) => (
          <div key={index}>
            <h2>{card.title}</h2>
            <p>{card.description}</p>
            <ul>
              {card.features.map((feature, index) => (
                <li key={index}>{feature}</li>
              ))}
            </ul>
            <button>Buy Now</button>
          </div>
        ))}
      </Slider>
    </div>
  )

React Slick Carousel Demo

响应性设置

React Slick还让我们通过responsive 属性来控制响应性。

responsive 属性是一个数组,有两个值:breakpointsettings

  • breakpoint - 我们希望后续设置生效的数字(像素)。
  • settings - 包含旋转木马设置的对象,在达到断点时应用。

将以下配置添加到sliderSettings

const sliderSettings = {
  // ...
  responsive: [
    {
      breakpoint: 1024,
      settings: {
       slidesToShow: 2,
      }
    },
    {
      breakpoint: 600,
      settings: {
       slidesToShow: 1,
      }
     }
  ]
};

有了这个配置,在不影响用户体验的情况下,控制我们的旋转木马在多个设备上的视图就变得容易了。

除了响应性之外,React Slick还将其accessibility 选项默认设置为true 。这允许方向键和在旋转木马上拖动鼠标的手势来移动旋转木马。

下面是一些其他的设置,你可以尝试一下。在他们的页面上查看所有的例子。

const settings = { 
    fade: true ,
    speed: 500, // ms
    autoplay: false,
    initialSlide: 2,
    lazyLoad: true,
    autoplaySpeed: 3000,
}

结论

React Slick是一个充满了良好选项的库,可以很容易地融入你的网络项目。在npm上有80万以上的下载量,React Slick可能真的是你最后需要的React旋转木马。

The postCreating a carousel with React Slickappeared first onLogRocket Blog.