MDX сочетает возможности Markdown с полной силой JSX, что позволяет внедрять в текстовые документы интерактивные компоненты. В отличие от обычного Markdown, где контент статичен, MDX дает возможность включать динамические элементы, управляемые состоянием и событиями.
MDX полностью совместим с React, поэтому любой React-компонент можно импортировать и использовать напрямую в документе.
import { Counter } from './components/Counter'
<Counter initialValue={0} />
Здесь Counter — это компонент, который может хранить
состояние, обрабатывать клики и обновлять интерфейс без необходимости
писать отдельный JS-файл для документации.
Ключевые моменты:
props) передаются так же, как в
обычном JSX.useState, useEffect) для управления
интерактивностью.Для создания интерактивных блоков необходимо использовать хуки состояния React. Пример счетчика кликов:
import { useState } from 'react'
function ClickCounter() {
const [count, setCount] = useState(0)
return (
<div>
<p>Количество кликов: {count}</p>
<button onCl ick={() => setCount(count + 1)}>Кликнуть</button>
</div>
)
}
<ClickCounter />
MDX автоматически рендерит JSX, поэтому такой компонент можно вставлять прямо в текст документации.
Особенности работы с состоянием:
React.Context) позволяет
делиться состоянием между несколькими интерактивными блоками.MDX позволяет создавать полноценные формы с обработкой событий,
включая onChange и onSubmit.
function FeedbackForm() {
const [value, setValue] = useState('')
const handleSubmit = (e) => {
e.preventDefault()
alert(`Вы ввели: ${value}`)
}
return (
<form onSub mit={handleSubmit}>
<input
type="text"
value={value}
onCha nge={(e) => setValue(e.target.value)}
placeholder="Введите текст"
/>
<button type="submit">Отправить</button>
</form>
)
}
<FeedbackForm />
Рекомендации при работе с интерактивными формами в MDX:
Formik, React Hook Form), интеграция с ними
полностью поддерживается.MDX поддерживает условный рендеринг и циклы через JSX. Это позволяет создавать интерактивные примеры с фильтрацией, пагинацией и переключателями.
function TabSwitcher() {
const [activeTab, setActiveTab] = useState('tab1')
return (
<div>
<button onCl ick={() => setActiveTab('tab1')}>Вкладка 1</button>
<button onCl ick={() => setActiveTab('tab2')}>Вкладка 2</button>
{activeTab === 'tab1' && <p>Содержимое первой вкладки</p>}
{activeTab === 'tab2' && <p>Содержимое второй вкладки</p>}
</div>
)
}
<TabSwitcher />
Преимущества использования динамических блоков:
Любые React-библиотеки интерфейсов (Material-UI, Ant Design, Chakra UI) полностью совместимы с MDX. Пример с кнопкой Material-UI:
import Button from '@mui/material/Button'
<Button variant="contained" color="primary">
Нажми меня
</Button>
Это дает возможность создавать интерактивные элементы с профессиональной стилизацией и поведением без переписывания компонентов под документацию.
MDX не ограничивает возможности работы с анимациями. Можно
использовать CSS-анимации, библиотеки вроде framer-motion
или react-spring для создания интерактивных переходов.
import { motion } from 'framer-motion'
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.5 }}
>
Появляющийся текст
</motion.div>
Плюсы применения анимаций в документации:
Интерактивные элементы в MDX превращают документацию в живой опыт: пользователи могут экспериментировать с компонентами прямо в тексте, что делает обучение и демонстрацию значительно эффективнее.