useState()
hook to create the active
state variable and give it a value of 0
(index of the first item).useEffect()
hook to update the value of active
to the index of the next item, using setTimeout
.className
for each carousel item while mapping over them and applying it accordingly.React.cloneElement()
and pass down ...rest
along with the computed className
..carousel { position: relative; } .carousel-item { position: absolute; visibility: hidden; } .carousel-item.visible { visibility: visible; }
const Carousel = ({ carouselItems, ...rest }) => { const [active, setActive] = React.useState(0); let scrollInterval = null; React.useEffect(() => { scrollInterval = setTimeout(() => { setActive((active + 1) % carouselItems.length); }, 2000); return () => clearTimeout(scrollInterval); }); return ( <div className="carousel"> {carouselItems.map((item, index) => { const activeClass = active === index ? ' visible' : ''; return React.cloneElement(item, { ...rest, className: `carousel-item${activeClass}` }); })} </div> ); };
ReactDOM.render( <Carousel carouselItems={[ <div>carousel item 1</div>, <div>carousel item 2</div>, <div>carousel item 3</div> ]} />, document.getElementById('root') );
Subscribe to get resources directly to your inbox. You won't receive any spam! ✌️