【问题标题】:Hide/Show React-slick arrows隐藏/显示 React-slick 箭头
【发布时间】:2018-06-23 17:46:45
【问题描述】:

我正在使用 react-slick,并且我有自己的自定义箭头。此滑块不是无限循环,我想隐藏循环开始和结束处的箭头。所以基本上在开始时 PrevArrow 应该被隐藏,最后 NextArrow 应该被隐藏。我正在尝试根据状态更改设置隐藏的类名。但是,尽管状态正在正确更改,但类名并未更改。你知道这段代码有什么问题吗?以及如何让它发挥作用?

下面是我对 Slider 和渲染 Slider 的组件的设置。

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import Slider from 'react-slick';
import Arrow from '../slider/Arrow';


export default class CityCarousel extends Component {
    constructor(props) {
        super(props);

        this.state = {
            displayLeftArrow: true,
            displayRightArrow: true
        };


        this.slidesToShow = 5;
        this.sliderSetting = {
            dots: false,
            arrows: true,
            infinite: false,
            initialSlide: 0,
            slidesToShow: this.slidesToShow,
            slidesToScroll: 1,
            speed: 500,
            rows: 0,
            nextArrow: <Arrow
                    styleClassName={`city-carousel__right ${
                        this.state.displayRightArrow ? '' : 'city-carousel__right--hide'
                    }`}
                    direction="right"
                    clickHandler={this.clickHandler}
                />,
            prevArrow: <Arrow
                    styleClassName={`city-carousel__left ${
                        this.state.displayLeftArrow ? '' : 'city-carousel__left--hide'
                    }`}
                    direction="left"
                    clickHandler={this.clickHandler}
                />,
            afterChange: currentSlide => this.setArrowDisplay(currentSlide)
        };
    }

    clickHandler = direction => {
        if (direction === 'left') {
            this.slider.slickPrev();
        } else if (direction === 'right') {
            this.slider.slickNext();
        }
    };

    setArrowDisplay = currentSlide => {
        const { cityList } = this.props;
        const displayLeftArrow = currentSlide !== 0;
        const displayRightArrow = currentSlide !== cityList.length - this.slidesToShow;

        this.setState({ displayRightArrow, displayLeftArrow });
    };

    render() {
        const { cityList, tours } = this.props;
        return (
            <div>
                <div className="city-selection">
                    <Slider
                        ref={c => this.slider = c }
                        {...this.sliderSetting}
                    >
                        {cityList.length > 0 ? this.renderCityList() : null}
                    </Slider>
                </div>
            </div>
        );
    }
}

这里也是箭头组件的代码

import React from 'react';
import PropTypes from 'prop-types';

const Arrow = ({ styleClassName, direction, clickHandler }) => {

    return(
    <div
        className={`slick-arrow--${direction} slider-arrow--${direction} ${styleClassName}`}
        onClick={e => clickHandler(direction)}
    />
)};

Arrow.propTypes = {
    styleClassName: PropTypes.string,
    direction: PropTypes.string,
    clickHandler: PropTypes.func
};

export default Arrow;

【问题讨论】:

    标签: reactjs react-slick


    【解决方案1】:

    在你的 this.sliderSettings 设置 nextArrowprevArrow 为你的箭头组件做这样的事情

    <Arrow 
      styleClassName={'YOUR_CLASSES_HERE'}
      direction="right" 
      clickHandler={this.clickHandler} 
      isHidden={this.state.isHidden} 
    />
    

    this.state.isHidden 是您尝试切换箭头的状态变量。

    然后在你的Arrow 组件中做这样的事情。

     const Arrow = ({ styleClassName, direction, clickHandler, isHidden }) => {
    
       return (
        <div
         className={`slick-arrow--${direction} slider-arrow--${direction} 
                    ${styleClassName}`}
         style={{ display: isHidden: 'none': 'block' }}
         onClick={e => clickHandler(direction)}
        />
       )
     };
    

    【讨论】:

    • 我实现了你的建议仍然不起作用 - 我确认状态正在改变但是当我用箭头控制台登录它时它仍然是旧值而不是更新状态
    • 我已经更新了我的答案,请查看Arrow 组件。
    • 还是不行...你有 jsFiddler 的例子吗?
    【解决方案2】:

    似乎react-slick 没有用新的道具重新渲染&lt;Arrow /&gt;,它总是使用第一个初始化的道具设置。

    我认为解决方案是让&lt;Arrow /&gt; 像这样从滑块中取出:

        <div className="city-selection">
          <Arrow
            styleClassName={`city-carousel__right ${
              this.state.displayRightArrow ? '' : 'city-carousel__right--hide'
              }`}
            direction="right"
            clickHandler={this.clickHandler}
          />
          <Arrow
            styleClassName={`city-carousel__left ${
              this.state.displayLeftArrow ? '' : 'city-carousel__left--hide'
              }`}
            direction="left"
            clickHandler={this.clickHandler}
          />
          <Slider
            {/* list of items*/}
          </Slider>
        </div>
    

    你可以在here看到它是如何工作的

    【讨论】:

    • 我认为更好的方法是编辑 css 文件以覆盖默认行为。在您的 app.css 中,您可以使用 .slick-disabled { opacity: 0% !important; } 使按钮在禁用时透明
    【解决方案3】:

    如果您想要对箭头进行最佳手动控制,请使用自定义箭头

    1. 使用简单的箭头组件创建它。
    2. 通过在主Slider 组件中使用ref 来设置该组件的onClick 处理程序。

      const sliderRef = useRef<Slider>(null);
      
      <Slider {...settings} ref={sliderRef}>
      
    3. 使用状态有条件地显示或隐藏箭头。

    我写了一篇博客文章,其中介绍了实现您想要的类似功能的工作流程。你可以在那里看看。

    https://medium.com/@imasharaful/image-slider-with-react-slick-d54a049f043

    【讨论】:

      【解决方案4】:

      将当前幻灯片道具传递给组件并检查要触发隐藏箭头的幻灯片:

      function SamplePrevArrow(props) {
          const { currentSlide, className, onClick } = props;
          if (currentSlide === 0) {
              return false;
          } else {
              return <div className={className} onClick={onClick} />;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-09
        • 2013-01-08
        • 1970-01-01
        • 1970-01-01
        • 2017-11-13
        • 2020-02-08
        • 2017-05-12
        • 1970-01-01
        相关资源
        最近更新 更多