MDX (Markdown + JSX) позволяет комбинировать разметку Markdown с компонентами React. В связке с загрузкой данных это открывает возможности динамического контента, где информация может поступать из API, локальных файлов или других источников.
В MDX файле можно использовать стандартные импорты из Jav * aScript:
import { useState, useEffect } from 'react';
import MyComponent from './MyComponent';
Импорт компонентов делает их доступными прямо в разметке MDX:
<MyComponent title="Динамический контент" />
Для работы с внешними API применяется стандартный fetch.
В MDX это часто делается через React hooks (useEffect,
useState), так как MDX поддерживает JSX:
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch('https://api.example.com/items')
.then(response => response.json())
.then(json => {
setData(json);
setLoading(false);
})
.catch(error => {
console.error('Ошибка загрузки данных:', error);
setLoading(false);
});
}, []);
В разметке MDX результат можно рендерить динамически:
{loading ? (
<p>Загрузка данных...</p>
) : (
<ul>
{data.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
)}
MDX поддерживает асинхронные функции, но напрямую в JSX их нельзя использовать. Поэтому оборачиваются они в хуки:
useEffect(() => {
async function fetchData() {
try {
const response = await fetch('https://api.example.com/items');
const json = await response.json();
setData(json);
} catch (error) {
console.error('Ошибка при асинхронной загрузке:', error);
} finally {
setLoading(false);
}
}
fetchData();
}, []);
MDX можно интегрировать в приложение через библиотеку
@mdx-js/react:
import { MDXProvider } from '@mdx-js/react';
import content from './content.mdx';
<MDXProvider components={{ MyComponent }}>
<content />
</MDXProvider>
Компоненты, переданные через MDXProvider, могут получать
данные из родительских компонентов, включая результаты
fetch. Таким образом создаются полностью динамические
страницы с MDX.
Для небольших данных можно использовать импорты JSON:
import data from './data.json';
<ul>
{data.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
Это удобно для статических данных или демо-контента, когда нет необходимости обращаться к внешнему API.
useMemo для кэширования обработанных данных.React.lazy для компонентов, которые зависят от данных.MDX позволяет вставлять компоненты прямо между блоками Markdown:
# Список товаров
<MyComponent data={data} />
Текст после списка
Markdown разметка рендерится как обычно, а компоненты могут динамически обновляться при изменении состояния.
Эти практики позволяют создавать MDX-документы с интерактивным и динамическим контентом, обеспечивая гибкость и масштабируемость учебных материалов или приложений.