MDX представляет собой расширение Markdown с поддержкой JSX, что позволяет интегрировать компоненты React прямо в Markdown-документы. Это открывает широкие возможности для управления состоянием внутри документации или учебных материалов, делая контент интерактивным.
Поскольку MDX поддерживает JSX, любые стандартные хуки React работают
в MDX-файлах. Наиболее часто используется useState для
управления локальным состоянием компонентов.
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return (
Счётчик: {count}
);
}
useState позволяет создавать локальное
состояние компонента.В MDX можно импортировать этот компонент и использовать его прямо в тексте:
Для управления состоянием, которое требуется нескольким компонентам, используется React Context. Это удобно для сохранения данных, которые должны быть доступны во всей MDX-документации.
import { createContext, useContext, useState } from 'react';
const ThemeContext = createContext();
export function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme(prev => (prev === 'light' ? 'dark' : 'light'));
};
return (
{children}
);
}
export function ThemeSwitcher() {
const { theme, toggleTheme } = useContext(ThemeContext);
return (
Текущая тема: {theme}
);
}
createContext создаёт объект контекста.useContext позволяет получать текущее значение
контекста.В MDX это будет использоваться так:
MDX позволяет создавать интерактивные блоки прямо в тексте:
import { useState } from 'react';
export const Spoiler = ({ children }) => {
const [visible, setVisible] = useState(false);
return (
{visible && {children}}
);
};
Использование в MDX:
Здесь скрытый контент, который можно показать или скрыть.
Для более сложных сценариев можно подключать библиотеки управления состоянием, такие как Redux, Zustand или Jotai. Они обеспечивают:
Пример с Zustand:
import create from 'zustand';
const useStore = create(set => ({
count: 0,
increment: () => set(state => ({ count: state.count + 1 })),
decrement: () => set(state => ({ count: state.count - 1 })),
}));
export function CounterZustand() {
const { count, increment, decrement } = useStore();
return (
Счётчик: {count}
);
}
Использование в MDX:
MDX позволяет интегрировать формы и обработчики событий, используя привычные механизмы React:
import { useState } from 'react';
export function FeedbackForm() {
const [input, setInput] = useState('');
const [submitted, setSubmitted] = useState(false);
const handleSubmit = e => {
e.preventDefault();
setSubmitted(true);
};
return (
);
}
useState).createContext +
useContext).Zustand, Redux).