我正在使用react-slick,我有自己的自定义箭头。这个Slider不是一个无限循环,我想在循环的开始和结束时隐藏箭头。所以基本上在开始时应该隐藏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>
);
}
}
这里也是Arrow组件的代码
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;
答案 0 :(得分:1)
似乎react-slick
没有使用新道具重新渲染<Arrow />
,并且它始终使用首次初始化道具设置。
我认为解决方法是将<Arrow />
从滑块中取出:
<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
中看到它是如何工作的答案 1 :(得分:1)
将当前幻灯片道具传递到组件,并检查要触发以隐藏箭头的幻灯片:
<vue-apex-charts
type="area"
height="230px"
:options="chartOptions"
:series="[{name: 'Sales', data: sales}, {name: 'Traffic', data: traffic}]"
></vue-apex-charts>
答案 2 :(得分:0)
在this.sliderSettings
集nextArrow
&amp;您的箭头组件的prevArrow
执行类似此操作的
<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)}
/>
)
};
答案 3 :(得分:0)
如果您希望对箭头进行最佳的手动控制,请使用自定义箭头。
通过在主onClick
组件中使用ref
来设置该组件的Slider
处理程序。
const sliderRef = useRef<Slider>(null);
<Slider {...settings} ref={sliderRef}>
使用状态有条件地显示或隐藏箭头。
我写了一篇博客文章,其中介绍了实现所需的类似功能的工作流程。你可以在那里看看。
https://medium.com/@imasharaful/image-slider-with-react-slick-d54a049f043