反应光滑的旋转木马循环通过幻灯片与滚动事件 - 反应js,javascript

时间:2017-12-04 20:47:54

标签: javascript reactjs react-slick

这是我正在使用的旋转木马:react-slick

我希望能够使用鼠标向上或向下滚动事件滚动每张幻灯片。

向上滚动以增加,向下滚动以减少。

在网上找到了一个我需要的例子 - 只是不确定如何将其转化为反应解决方案。

示例:https://codepen.io/Grawl/pen/mMLQQb

在基于“反应”组件的方法中实现这一目标的最佳方法是什么?

这是我的反应组件:

import React from 'react';
import PropTypes from 'prop-types';
import styles from './styles.css';
import ReactSVG from 'react-svg';
import Slider from 'react-slick';


import MobileSVG from '../../../assets/svg/icons/Mobile_Icon_Option2.svg';
import TabletSVG from '../../../assets/svg/icons/Tablet_Icon_Option2.svg';
import DesktopSVG from '../../../assets/svg/icons/Desktop_Icon_Option2.svg';

const deviceIcons = {'mobile': MobileSVG, 'tablet': TabletSVG, 'desktop': DesktopSVG};

import BackToTopButton from '../BackToTopButton';

export default class ProductComponent extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
        };

    }

    render() {
        const {productData} = this.props

        //Slider settings
        const settings = {
            dots: true,
            infinite: false,
            speed: 500,
            fade: true,
            arrows: false,
            centerMode: true,
            slidesToShow: 1,
            slidesToScroll: 1
        }

        //Slider items
        const sliderItems = productData.map((obj, i) => {
            return (
                <div className="product-component row" key={i}>
                    <div className="product-component-image-wrap col-xs-12 col-sm-8">
                        <span className="product-heading">{obj.category}</span>
                        <div className="product-detail-wrap">
                            <img className="product-component-image" src={`${process.env.DB_URL}${obj.image}`} />
                            <ul className="list-device-support">
                                {obj.categoryDeviceSupport.map((obj, i) => {
                                    return (<li key={i}>
                                        <span className="svg-icon">
                                            <ReactSVG path={deviceIcons[obj.value]} />
                                        </span>
                                        <span className="product-label">{obj.label}</span>
                                    </li>)
                                })}
                            </ul>
                        </div>
                    </div>
                    <div className="product-component-info col-xs-12 col-sm-3"> 
                        <span className="align-bottom">{obj.title}</span>
                        <p className="align-bottom">{obj.categoryBrief}</p>
                    </div>
                </div>
            )
        });
        return (
            <div className="product-component-wrap col-xs-12">
                <Slider {...settings}>
                    {sliderItems}
                </Slider>
                <BackToTopButton scrollStepInPx="50" delayInMs="7" />
            </div>
        )
    }
}

ProductComponent.propTypes = {
    productData: PropTypes.array
};

ProductComponent.defaultProps = {
    productData: []
};

4 个答案:

答案 0 :(得分:5)

以下内容适用于您:

&#xA;&#xA;
  componentDidMount(){&#xA;让slickListDiv = document.getElementsByClassName('slick-list')[0]&#xA; slickListDiv.addEventListener('wheel',event =&gt; {&#xA; event.preventDefault()&#xA; event.deltaY&gt; 0?this.slider.slickNext():this.slider.slickPrev()&# xA;})&#xA;}&#xA;  
&#xA;&#xA;

您应该像这样初始化组件:

&#xA;&# xA;
 &lt; Slider {... settings} ref = {slider =&gt; this.slider = slider.innerSlider}&gt;&#xA; ...&#xA;&lt; / Slider&gt;&#xA;  
&#xA;

答案 1 :(得分:3)

你想做这样的事情:

constructor(props){
    super(props);
    this.slide = this.slide.bind(this);
}
slide(y){
    y > 0 ? (
       this.slider.slickNext()
    ) : (
       this.slider.slickPrev()
    )
}
componentWillMount(){
    window.addEventListener('wheel', (e) => {
        this.slide(e.wheelDelta);
    })
}
render(){...

并在滑块上添加参考:

<Slider ref={slider => this.slider = slider }>

因此,当轮子事件的y值大于0时,即向上滚动然后显示下一张幻灯片,向下滚动显示上一张幻灯片。

答案 2 :(得分:1)

我在CustomSlider组件中使用以下代码:

  constructor(props) {
    super(props);
    this.handleWheel = this.handleWheel.bind(this);
  }

  componentDidMount() {
    ReactDOM.findDOMNode(this).addEventListener('wheel', this.handleWheel);
  }

  componentWillUnmount() {
    ReactDOM.findDOMNode(this).removeEventListener('wheel', this.handleWheel);
  }

  handleWheel(e) {
    e.preventDefault();
    e.deltaY > 0 ? this.slider.slickNext() : this.slider.slickPrev();
  }

组件初始化

 <Slider ref={slider => this.slider = slider }>
   ...
 </Slider>

答案 3 :(得分:0)

带钩子

const sliderRef = createRef();
const scroll = useCallback(
    y => {
      if (y > 0) {
        return sliderRef?.current?.slickNext(); /// ? <- using description below 
      } else {
        return sliderRef?.current?.slickPrev();
      }
    },
    [sliderRef]
  );
 useEffect(() => {
    window.addEventListener("wheel", e => {
      scroll(e.deltaY);
    });
  }, [scroll]);

我使用了来自与Babel插件连接的打字稿的可选链接,但是您可以使用以下验证:

 sliderRef.current && sliderRef.current.slickNext()