MDX (Markdown + JSX) позволяет интегрировать компоненты React прямо в Markdown-документы, что делает его мощным инструментом для создания интерактивных элементов, таких как галереи изображений и слайдеры. Основная идея заключается в том, что разметка документа остаётся читабельной в Markdown, а динамические элементы реализуются через JSX-компоненты.
Для организации галереи или слайдера необходимо сначала создать или импортировать соответствующий React-компонент. Например:
import ImageGallery from './components/ImageGallery';
import Slider from './components/Slider';
После этого компоненты можно использовать прямо в MDX-документе:
Ключевой момент — передача данных через пропсы. В случае галереи это
обычно массив объектов с полями src, alt,
caption. Для слайдера часто используются поля
title, description, image.
Правильная организация данных позволяет легко расширять функциональность. Пример структуры для галереи:
const imagesArray = [
{ src: '/images/photo1.jpg', alt: 'Описание фото 1', caption: 'Фото 1' },
{ src: '/images/photo2.jpg', alt: 'Описание фото 2', caption: 'Фото 2' },
{ src: '/images/photo3.jpg', alt: 'Описание фото 3', caption: 'Фото 3' }
];
Такой подход позволяет компонента автоматически рендерить изображения, подписи и, при необходимости, реализовывать эффекты наведения или модальные окна.
Слайдеры в MDX реализуются через компоненты React с поддержкой состояния и эффектов. Основные возможности включают:
setInterval или хука useEffect.Пример минимального слайдера:
import { useState, useEffect } from 'react';
export default function Slider({ slides, autoPlay = false, interval = 3000 }) {
const [currentIndex, setCurrentIndex] = useState(0);
useEffect(() => {
if (!autoPlay) return;
const timer = setInterval(() => {
setCurrentIndex(prev => (prev + 1) % slides.length);
}, interval);
return () => clearInterval(timer);
}, [autoPlay, interval, slides.length]);
const nextSlide = () => setCurrentIndex((currentIndex + 1) % slides.length);
const prevSlide = () => setCurrentIndex((currentIndex - 1 + slides.length) % slides.length);
return (
{slides[currentIndex].title}
);
}
MDX позволяет использовать как глобальные CSS-файлы, так и CSS-in-JS решения. Для слайдеров и галерей часто применяются следующие приёмы:
:hover и
:focus для эффектов при наведении.Пример CSS для галереи:
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
}
.gallery img {
width: 100%;
height: auto;
border-radius: 8px;
transition: transform 0.3s ease;
}
.gallery img:hover {
transform: scale(1.05);
}
MDX позволяет подключать данные из внешних источников или JSON-файлов:
import images from './data/images.json';
Такой подход упрощает обновление содержимого без изменения кода компонента. Для больших проектов это критически важно, поскольку позволяет отделить контент от презентации.
Для расширенной функциональности галерей часто используется модальное окно для увеличения изображений. Пример интеграции с модальным компонентом:
import Modal from './Modal';
function ImageGallery({ images }) {
const [selected, setSelected] = useState(null);
return (
<>
{images.map((img, index) => (
setSelected(img)} />
))}
{selected && setSelected(null)} content={
} />}
>
);
}
Это позволяет реализовать полноценную интерактивную галерею с увеличением изображения и поддержкой навигации внутри модального окна.
MDX поддерживает любые сторонние React-библиотеки. Для слайдеров и галерей часто используются:
framer-motion для плавных анимаций слайдов.react-spring для динамических эффектов.swiper для готовых слайдеров с множеством функций.Использование этих библиотек повышает интерактивность и визуальную привлекательность интерфейса.