Hide/Show React-slick 箭头
Hide/Show React-slick arrows
我使用的是 react-slick,我有自己定制的箭头。此 Slider 不是无限循环,我想隐藏循环开始和结束处的箭头。所以基本上在开始时 PrevArrow 应该被隐藏,而在结束时 NextArrow 应该被隐藏。我试图根据状态变化设置隐藏的 class 名称。然而,class 名称并没有改变,尽管状态正在正确改变。你知道这段代码有什么问题吗?以及如何让它发挥作用?
下面是我对 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;
在你的 this.sliderSettings
中为你的 Arrow 组件设置 nextArrow
& 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)}
/>
)
};
似乎 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
中查看它的工作原理
如果您想要对箭头进行最佳手动控制,请使用自定义箭头。
- 使用简单的箭头组件创建它。
通过在主 Slider
组件中使用 ref
设置该组件的 onClick
处理程序。
const sliderRef = useRef<Slider>(null);
<Slider {...settings} ref={sliderRef}>
使用状态有条件地显示或隐藏箭头。
我写了一篇博客 post,其中介绍了实现您想要的类似功能的工作流程。你可以去那里看看。
https://medium.com/@imasharaful/image-slider-with-react-slick-d54a049f043
将当前的幻灯片道具传递给组件并检查要触发隐藏箭头的幻灯片:
function SamplePrevArrow(props) {
const { currentSlide, className, onClick } = props;
if (currentSlide === 0) {
return false;
} else {
return <div className={className} onClick={onClick} />;
}
}
我使用的是 react-slick,我有自己定制的箭头。此 Slider 不是无限循环,我想隐藏循环开始和结束处的箭头。所以基本上在开始时 PrevArrow 应该被隐藏,而在结束时 NextArrow 应该被隐藏。我试图根据状态变化设置隐藏的 class 名称。然而,class 名称并没有改变,尽管状态正在正确改变。你知道这段代码有什么问题吗?以及如何让它发挥作用?
下面是我对 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;
在你的 this.sliderSettings
中为你的 Arrow 组件设置 nextArrow
& 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)}
/>
)
};
似乎 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
中查看它的工作原理如果您想要对箭头进行最佳手动控制,请使用自定义箭头。
- 使用简单的箭头组件创建它。
通过在主
Slider
组件中使用ref
设置该组件的onClick
处理程序。const sliderRef = useRef<Slider>(null); <Slider {...settings} ref={sliderRef}>
使用状态有条件地显示或隐藏箭头。
我写了一篇博客 post,其中介绍了实现您想要的类似功能的工作流程。你可以去那里看看。
https://medium.com/@imasharaful/image-slider-with-react-slick-d54a049f043
将当前的幻灯片道具传递给组件并检查要触发隐藏箭头的幻灯片:
function SamplePrevArrow(props) {
const { currentSlide, className, onClick } = props;
if (currentSlide === 0) {
return false;
} else {
return <div className={className} onClick={onClick} />;
}
}