react.js antd 带箭头的轮播

IT技术 reactjs carousel antd
2021-04-02 05:11:26

我正在考虑使用 antd Caroseul,但我还没有看到创建上一个/下一个或暂停按钮的示例。

const { Carousel } = antd;

ReactDOM.render(
  <Carousel autoplay>
    <div><h3>1</h3></div>
    <div><h3>2</h3></div>
    <div><h3>3</h3></div>
    <div><h3>4</h3></div>
  </Carousel>
, document.getElementById('app'));
6个回答
import React, { Component } from "react";
import { Carousel, Icon } from "antd";

export default class CarouselComponent extends Component {
  constructor(props) {
    super(props);
    this.next = this.next.bind(this);
    this.previous = this.previous.bind(this);
    this.carousel = React.createRef();
  }
  next() {
    this.carousel.next();
  }
  previous() {
    this.carousel.prev();
  }

  render() {
    const props = {
      dots: true,
      infinite: true,
      speed: 500,
      slidesToShow: 1,
      slidesToScroll: 1
    };
    return (
      <div>
        <Icon type="left-circle" onClick={this.previous} />
        <Carousel ref={node => (this.carousel = node)} {...props}>
          <div>
            <h3>1</h3>
          </div>
          <div>
            <h3>2</h3>
          </div>
          <div>
            <h3>3</h3>
          </div>
          <div>
            <h3>4</h3>
          </div>
        </Carousel>
        <Icon type="right-circle" onClick={this.next} />
      </div>
    );
  }
}
请接受此答案,以便其他开发人员也知道答案。
2021-06-18 05:11:26

首先:arrow是一个有效的 Carousel 属性,可以让箭头手动控制内容。默认情况下它被antd禁用

您可以像这样启用它:

<Carousel arrows>
//
</Carousel>

但你不会看到他们,因为风格.ant-carousel .slick-prev.ant-carousel .slick-prev透明。

antd 轮播箭头默认样式

此时您已经可以覆盖样式(示例display: block; background: red)。


另一种选择是从 prop 内部控制样式,使用React Slick属性,因为 antd 在轮播组件的引擎盖下使用它。

这是一个完整的组件示例:

import React from 'react'
import { Row, Col, Carousel } from 'antd'

const contentStyle = {
  height: '160px',
  color: '#fff',
  lineHeight: '160px',
  textAlign: 'center',
  background: '#364d79'
}

// from https://react-slick.neostack.com/docs/example/custom-arrows
const SampleNextArrow = props => {
  const { className, style, onClick } = props
  return (
    <div
      className={className}
      style={{ ...style, display: 'block', background: 'red' }}
      onClick={onClick}
    />
  )
}

const SamplePrevArrow = props => {
  const { className, style, onClick } = props
  return (
    <div
      className={className}
      style={{ ...style, display: 'block', background: 'green' }}
      onClick={onClick}
    />
  )
}

const settings = {
  nextArrow: <SampleNextArrow />,
  prevArrow: <SamplePrevArrow />
}

const CarouselArrows = () => {
  return (
    <>
      <Row justify="center">
        <Col span={16}>
          <Carousel arrows {...settings}>
            <div>
              <h3 style={contentStyle}>1</h3>
            </div>
            <div>
              <h3 style={contentStyle}>2</h3>
            </div>
            <div>
              <h3 style={contentStyle}>3</h3>
            </div>
            <div>
              <h3 style={contentStyle}>4</h3>
            </div>
          </Carousel>
        </Col>
      </Row>
    </>
  )
}

export default CarouselArrows

箭头示例


有一个::before带有content属性选择器,它有点搞砸了样式(您不能从内联样式覆盖它)。不过,您可以利用它并将箭头函数更改为:

const SampleNextArrow = props => {
  const { className, style, onClick } = props
  return (
    <div
      className={className}
      style={{ ...style, display: 'block', background: 'red' }}
      onClick={onClick}
    />
  )
}

const SamplePrevArrow = props => {
  const { className, style, onClick } = props
  return (
    <div
      className={className}
      style={{ ...style, display: 'block', background: 'green' }}
      onClick={onClick}
    />
  )
}

在此处输入图片说明


您可以覆盖默认的 antd 样式以删除::before选择器并包含图标。

在 LESS 文件中:

.ant-carousel {
  .slick-next {
    &::before {
      content: '';
    }
  }
  .slick-prev { 
    &::before {
      content: '';
    }
  }
}

在您的组件中(暗示您正在使用上例中提供的组件):

import { LeftOutlined, RightOutlined } from '@ant-design/icons'

// ...

const SampleNextArrow = props => {
  const { className, style, onClick } = props
  return (
    <div
      className={className}
      style={{
        ...style,
        color: 'black',
        fontSize: '15px',
        lineHeight: '1.5715'
      }}
      onClick={onClick}
    >
      <RightOutlined />
    </div>
  )
}

const SamplePrevArrow = props => {
  const { className, style, onClick } = props
  return (
    <div
      className={className}
      style={{
        ...style,
        color: 'black',
        fontSize: '15px',
        lineHeight: '1.5715'
      }}
      onClick={onClick}
    >
      <LeftOutlined />
    </div>
  )
}

最后,所需的输出:

在此处输入图片说明

在阅读https://ant.design/components/carousel/ 时,我滚动到底部,它说它正在使用https://github.com/akiran/react-slick

如果向下滚动到prop表格,您可以使用nextArrowor prevArrowwhich 将 React Element 作为值。

谢谢你。react-slick.neostack.com/docs/api/#arrows上的 react- slick文档什么nextArrow或者prevArrow是什么我想左右箭头的对象是相同的我应该把AntD Carousel 代码放在哪里arrowsarrowsarrows
2021-06-02 05:11:26
请在此处显示用于箭头实现的道具类型示例。
2021-06-17 05:11:26

如果要添加箭头,可以使用 Antd 提供的箭头图标

<Carousel arrows nextArrow={<ArrowRightOutlined />} prevArrow={<ArrowLeftOutlined/>}>

由于箭头被 Antd css 隐藏,您可以在自己的 css 中使用以下内容覆盖它:

.ant-carousel .slick-prev,
.ant-carousel .slick-next {
  color: unset;
  font-size: unset;
}

.ant-carousel .slick-prev:hover,
.ant-carousel .slick-next:hover,
.ant-carousel .slick-prev:focus,
.ant-carousel .slick-next:focus {
  color: unset;
}

只需遵循以下代码: 使用 useRef 钩子并将 Ref 分配给 Carousel,然后通过 refrence 调用 next 和 prev 方法。

import React, { useRef, Fragment } from "react";
import { Carousel } from "antd";

const MyCarousel = () => {
const slider = useRef(null);

return ( 
<Fragment >
    <Button onClick={() => slider.current.next()}>next</Button>
    <Carousel ref={slider}>
        <div>Item 1</div>
        <div>Item 2</div>
        <div>Item 3</div>
    </Carousel>
    <Button onClick={() => slider.current.next()}>next</Button>
</Fragment >
)}
对我来说这没有用(我的程序因为找不到函数而崩溃)。所以我不得不声明 let slider = useRef(null). 然后在轮播中,我不得不像这样调用 ref:<Carousel { ...settings } ref={ node => slider = node } ...
2021-05-27 05:11:26
这对我有用。最好的解决方案对我有用。
2021-06-01 05:11:26