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! ✌️