Для создания бесконечного слайдера с анимацией в Next.js, который выделяет текущий элемент, вам нужно будет обработать несколько аспектов:
1. **Анимация слайдера**: Используйте `useEffect` и `setInterval` для цикличного переключения между элементами.
2. **Управление классами**: Создайте состояние, которое будет отслеживать, какой элемент является "основным", и обновляйте его при прокрутке.
3. **Уникальные ключи для React**: Убедитесь, что ключи уникальны для каждого элемента списка, чтобы избежать предупреждений в консоли.
Ниже приведённый пример, который включает эти аспекты:
```javascript
import React, { useState, useEffect } from "react";
import { StyledCardList, StyledSecondaryCard } from './styled';
import cardDetails from "./swiperconfig";
const TRANSITION_DURATION = 1500;
export const Carousel = () => {
const [currentIndex, setCurrentIndex] = useState(0);
const [transitionDuration, setTransitionDuration] = useState(TRANSITION_DURATION);
useEffect(() => {
const interval = setInterval(() => {
setTransitionDuration(TRANSITION_DURATION);
setCurrentIndex((prevIndex) => (prevIndex + 1) % cardDetails.length);
}, TRANSITION_DURATION);
return () => {
clearInterval(interval);
};
}, []);
const handleTransitionEnd = () => {
setTransitionDuration(0); // Чтобы избежать перезапусков
}
return (
<StyledCardList onTransitionEnd={handleTransitionEnd} style={{ transitionDuration: `${transitionDuration}ms` }}>
{cardDetails.map((card, index) => {
const isActive = index === currentIndex;
return (
<StyledSecondaryCard
key={card.id} // Убедитесь, что card.id уникален
className={isActive ? 'main' : ''}
style={{
transform: isActive ? 'scale(1.2)' : 'scale(1)', // Увеличение для активного элемента
backgroundColor: isActive ? '#f0f0f0' : 'transparent', // Яркий фон для активного элемента
}}
>
{card.icon}
</StyledSecondaryCard>
);
})}
</StyledCardList>
);
}
```
### Объяснение кода:
1. **Состояние `currentIndex`**: Оно отслеживает текущий индекс "основного" элемента.
2. **`setInterval`**: Запускает переключение каждые `TRANSITION_DURATION` миллисекунд для плавной анимации.
3. **Классы и стили**: Используйте условное присваивание классов и инлайн-стили для изменения внешнего вида активного элемента.
4. **Ключи**: Убедитесь, что вы используете уникальные идентификаторы из `cardDetails` в качестве ключей.
### Вопросы:
- **`key`**: React использует `key` для оптимизации рендеринга списков. Ключи помогают React определять, какие элементы изменились, были добавлены или удалены. Убедитесь, что ключи уникальны для каждого элемента в списке.
- **Двойной вызов `setTimeout`**: Если вы видите, что `setTimeout` вызывается дважды в режиме разработки, убедитесь, что функция не вызывается дважды в `useEffect`, и используйте `cleanup` функцию, чтобы очистить таймер.
### Заключение:
Этот код предоставляет основу для реализации анимации бесконечного слайдера и управления классами в массиве объектов. Вы можете настраивать стили, анимации и задержки по своему усмотрению.