MDX сочетает возможности Markdown и JSX, позволяя включать компоненты React прямо в Markdown-документы. Одним из ключевых аспектов MDX является работа с динамическими компонентами, которые позволяют изменять отображение контента в зависимости от состояния, данных или контекста выполнения.
Для использования динамических компонентов в MDX необходимо их
импортировать или регистрировать через
MDXProvider:
import { Button } from './components/Button';
import { Alert } from './components/Alert';
<MDXProvider components={{ Button, Alert }}>
<MDXContent />
</MDXProvider>
MDXProvider позволяет глобально определить, какие
компоненты будут доступны в MDX-документе.const components = {
h1: (props) => <h1 style={{ color: 'tomato' }} {...props} />,
p: (props) => <p className="custom-paragraph" {...props} />,
};
MDX поддерживает полный синтаксис JSX, что открывает возможности для динамического контента:
const count = 3;
{Array.from({ length: count }).map((_, index) => (
<Button key={index} label={`Кнопка ${index + 1}`} />
))}
{}, что позволяет динамически вычислять контент прямо в
Markdown.Компоненты MDX полностью интегрируются с React, поэтому поддерживаются пропсы и хуки состояния:
import { useState } from 'react';
import { Toggle } from './components/Toggle';
function InteractiveToggle() {
const [active, setActive] = useState(false);
return <Toggle active={active} onCl ick={() => setActive(!active)} />;
}
<InteractiveToggle />
useState, useEffect,
useContext работают так же, как и в обычных
React-компонентах, что делает MDX полноценной средой для интерактивного
контента.MDX поддерживает ленивую загрузку компонентов, что снижает размер бандла и улучшает производительность:
import dynamic from 'next/dynamic';
const Chart = dynamic(() => import('./components/Chart'), { ssr: false });
<Chart data={chartData} />
dynamic позволяет загружать тяжелые компоненты только
при необходимости.MDX интегрируется с контекстом React, что позволяет создавать динамически изменяемый контент, зависящий от внешнего состояния:
import { ThemeContext } from './context/ThemeContext';
function ThemedButton() {
const { theme } = useContext(ThemeContext);
return <button style={{ background: theme.background, color: theme.color }}>Нажми меня</button>;
}
<ThemedButton />
MDXProvider можно создавать глобально
доступные динамические компоненты с адаптивным поведением.Для динамических компонентов в MDX часто применяются условные конструкции, аналогичные JSX:
{isLoggedIn ? <Button label="Выйти" /> : <Button label="Войти" />}
MDX идеально подходит для документации с живыми примерами, где компоненты реагируют на действия пользователя:
import { Counter } from './components/Counter';
<Counter initial={0} />
MDXProvider для
унификации стиля и поведения компонентов в проекте.Динамические компоненты в MDX открывают возможности для создания богатых, интерактивных документов, сочетая удобство Markdown с мощью React. Они позволяют управлять состоянием, загружать контент по требованию и интегрироваться с контекстами, делая документацию и интерфейсы гибкими и отзывчивыми.