Каруселі – це популярний інструмент веб-дизайну для презентації зображень чи контенту в інтерактивному форматі. Вони стали невід’ємною частиною багатьох веб-сайтів, зокрема для показу різних портфоліо. Проте, іноді виникають проблеми з відображенням каруселі, особливо коли мова йде про різні портфоліо з різною кількістю зображень.
Одна з таких проблем, що може виникнути, – це ситуація, коли активний елемент каруселі залишається на останньому зображенні попереднього портфоліо, а поточне портфоліо має менше зображень. Це може призвести до відображення порожнього слайда або збою в роботі каруселі взагалі.
Давайте розглянемо сценарій, коли ми маємо різні портфоліо з різною кількістю зображень, і нам потрібно вирішити цю проблему, зберігаючи функціональність каруселі і забезпечуючи коректне відображення зображень для кожного портфоліо.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
import React, { useState, useEffect } from "react"; import { PortfolioJSON } from "./list"; function Portfolio() { const [project, setProject] = useState("BBB 23 - Corrida"); const [filteredProject, setFilteredProject] = useState([]); useEffect(() => { const filtered = () => { return PortfolioJSON.filter((item) => item.projetoName === project).map( (projeto) => projeto.images.map((image, index) => ( <div key={image.image} className={`carousel-item ${index === 0 ? "active" : ""}`} > <img src={image.image} className="d-block rounded-4 w-100" alt="..." /> <div className="carousel-caption d-none d-md-block pb-0"> <h5>{projeto.title}</h5> <p>{projeto.subtitle}</p> </div> </div> )) ); }; setFilteredProject(filtered); }, [project]); return ( <> <h1 id="scrollspyHeading2" className="text-center"> Portifólio </h1> <div className="container d-flex flex-column flex-sm-row"> <ul className="nav nav-tabs-custom me-0 me-sm-3 mb-3 mb-sm-0"> {PortfolioJSON.map((projeto) => ( <li className="nav-item text-no-wrap" key={projeto.projetoName}> <button className={`nav-link text-nowrap text-end w-100 ${ projeto.projetoName === project ? "active-project" : "" }`} aria-current="page" onClick={() => setProject(projeto.projetoName)} > {projeto.projetoName} </button> </li> ))} </ul> <div id="carouselExampleIndicators2" className="carousel slide"> <div className="carousel-indicators mb-0"> {PortfolioJSON.filter((item) => item.projetoName === project).map( (item) => item.images.map((image, index) => ( <button type="button" data-bs-target="#carouselExampleIndicators2" data-bs-slide-to={index} className={index === 0 ? "active" : ""} aria-current="true" aria-label={`Slide ${index++}`} ></button> )) )} </div> <div className="carousel-inner">{filteredProject}</div> <button className="carousel-control-prev" type="button" data-bs-target="#carouselExampleIndicators2" data-bs-slide="prev" > <span className="carousel-control-prev-icon" aria-hidden="true" ></span> <span className="visually-hidden">Previous</span> </button> <button className="carousel-control-next" type="button" data-bs-target="#carouselExampleIndicators2" data-bs-slide="next" > <span className="carousel-control-next-icon" aria-hidden="true" ></span> <span className="visually-hidden">Next</span> </button> </div> </div> </> ); } export default Portfolio; |
Щоб вирішити цю проблему, ми можемо скористатися вбудованим методом JavaScript, який дозволяє нам змінювати активний елемент каруселі при зміні проекту портфоліо. Для цього ми використовуємо ефект useEffect, який викликається при зміні значення проекту портфоліо. У цьому ефекті ми фільтруємо дані портфоліо, щоб отримати потрібні зображення для нового проекту, та оновлюємо стан filteredProject, який відповідає за відображення зображень у каруселі.
Загалом, зміна активного елемента каруселі при зміні проекту портфоліо вирішує проблему з відображенням порожніх слайдів або збоїв в роботі каруселі, забезпечуючи коректне відображення зображень для кожного портфоліо. Це дозволяє нам зберегти функціональність каруселі і поліпшити користувацький досвід на веб-сайті.