#reactjs #markdown #next.js #remarkjs #chakra-ui
#reactjs #markdown #next.js #remarkjs #chakra-пользовательский интерфейс
Вопрос:
Контекст: у меня есть Next.js сайт с пользовательским интерфейсом Chakra. У меня есть некоторый пользовательский контент markdown, который извлекается из внешнего источника (скажем, GitHub README.md
для репозитория) во время выполнения.
Теперь, по умолчанию, react-markdown (основанный на remarkjs) использует HTML <img>
-тег для изображений markdown ( ![]()
). Я хочу использовать новый <Image />
компонент, выпущенный в Next.js 10 в предоставленной пользователем уценке. Кроме того, я также хотел бы заменить другие теги соответствующими компонентами пользовательского интерфейса Chakra.
Как мне это сделать?
РЕШЕНИЕ
// utils/parser.tsx
import Image from 'next/image';
export default function ImageRenderer({ src, alt }) {
return <Image src={src} alt={alt} unsized />;
}
а затем на требуемой странице:
//pages/readme.tsx
import ReactMarkdown from 'react-markdown';
import imageRenderer from '../utils/parser';
// `readme` is sanitised markdown that comes from getServerSideProps
export default function Module({ readme }) {
return <ReactMarkdown allowDangerousHtml={true} renderers={{ image: imageRenderer }} children={readme} />
}
то же самое для других элементов…
Ответ №1:
react-markdown позволяет определять собственные средства визуализации. Недавно я сделал нечто подобное. Я хочу использовать элементы figure и figurecaption. Итак, я создал свой собственный компонент react для визуализации изображений.
Компонент
export default function ImageRenderer(props) {
const imageSrc = props.src;
const altText = props.alt;
return (
<figure className="wp-block-image size-large is-resized">
<img
data-loading="lazy"
data-orig-file={imageSrc}
data-orig-size="1248,533"
data-comments-opened="1"
data-image-meta="{amp;quot;apertureamp;quot;:amp;quot;0amp;quot;,amp;quot;creditamp;quot;:amp;quot;amp;quot;,amp;quot;cameraamp;quot;:amp;quot;amp;quot;,amp;quot;captionamp;quot;:amp;quot;amp;quot;,amp;quot;created_timestampamp;quot;:amp;quot;0amp;quot;,amp;quot;copyrightamp;quot;:amp;quot;amp;quot;,amp;quot;focal_lengthamp;quot;:amp;quot;0amp;quot;,amp;quot;isoamp;quot;:amp;quot;0amp;quot;,amp;quot;shutter_speedamp;quot;:amp;quot;0amp;quot;,amp;quot;titleamp;quot;:amp;quot;amp;quot;,amp;quot;orientationamp;quot;:amp;quot;0amp;quot;}"
data-image-title="builtin_vs_dotnetwarp"
data-image-description=""
data-medium-file={imageSrc "?w=300"}
data-large-file={imageSrc "?w=750"}
src={imageSrc "?w=10241"}
alt={altText}
srcSet={imageSrc "?w=1024 1024w, " imageSrc "?w=705 705w, " imageSrc "?w=150 150w, " imageSrc "?w=300 300w, " imageSrc "?w=768 768w, " imageSrc "?1248w"}
sizes="(max-width: 707px) 100vw, 707px" />
<figcaption style={{ textAlign: "center" }}>{altText}</figcaption>
</figure>
);
}
И я использую этот рендерер, как показано ниже
<ReactMarkdown source={blogResponse.data.content} escapeHtml={false} renderers={{ "code": CodeBlockRenderer, "image": ImageRenderer }} />
renderers={{ «code»: CodeBlockRenderer, «image»: ImageRenderer }} — это место, где вы упоминаете пользовательские средства визуализации.
Комментарии:
1. но я все еще не понимаю, как установить пользовательские
h1...h6
теги заголовков.2. Мне никогда не приходилось изменять заголовки. Можете ли вы поделиться своим кодом?
3. Я не обязательно должен, но я хочу использовать компонент заголовка пользовательского интерфейса Chakra. Я заглянул в документы по визуализации и обнаружил, что у него есть
heading
опция, но я не знаю, как различать h1 и h2. можете ли вы указать мне на лучшие документы по визуализации? repo: github.com/maximousblk/next-nest-test4. Для заголовка реквизит будет иметь свойство с именем level , которое вы можете использовать для различения между h1, h2 ..h6. Пример кода можно найти здесь . github.com/Dhrutara/blogs.dhrutara.com.blogs/tree/main /…