我使用Prism来突出显示我的markdown代码片段,我调用Prism.highlightAll()
,并且我有一个标记了<pre>
的部分,但是,它没有突出显示我的语法。
下面是我的组件,它带有useEffect
钩子,试图突出显示(我检查了,它正在被调用):
const ArticlePage: NextPage<{ article: Article }> = ({ article }) => {
useEffect(() => {
Prism.highlightAll(); // <-- HERE IT IS BEING CALLED
}, []);
return (
<div className={styles.box}>
<h1 className="mb-5 text-6xl leading-1 font-extrabold">
{article.title}
</h1>
<ReactMarkdown>{markdown}</ReactMarkdown> // <-- What I'm trying to highlight
</div>
);
};
我的markdown
是从这里拉平凡:
const markdown: string = "```dart\nprint('hello');\nprint('world');\n```";
以下是我的相关导入:
import Prism from "prismjs";
import { useEffect } from "react";
require("prismjs/components/prism-javascript");
require("prismjs/components/prism-dart");
require("prismjs/components/prism-css");
require("prismjs/components/prism-jsx");
我还使用getServerSideProps
来返回我需要呈现的实际markdown(为了简洁起见,这个例子我硬编码了它):
export const getServerSideProps: GetServerSideProps = async (context) => {
const slug = context.query.slug;
const res = await fetch(
"https://MY_WEBSITE_URL/article/" + slug
);
const article: Article = await res.json();
return {
props: {
article,
},
};
};
export default ArticlePage;
下面是检查元素的外观:
下面是网页的表示(没有语法高亮!):
如果有帮助的话,我会使用Typescript、TailwindCSS、NextJS,并从内置于Rust(Actix-Web)的Heroku Web服务器中提取。
任何帮助都将是巨大的,谢谢!
1条答案
按热度按时间qncylg1j1#
看起来问题可能与Prism.highlightAll()函数被调用的时间有关。useEffect钩子在页面被呈现并且markdown被转换为HTML之后在客户端运行。但是,Prism.highlightAll()需要在markdown被呈现之前被调用,以便正确地突出显示代码片段。
解决这个问题的一个方法是使用dangerouslySetInnerHTML属性将markdown作为原始HTML插入,然后在呈现markdown之前调用Prism.highlightAll()。
另一种方法是使用react-prism这样的第三方包来处理高亮显示,这个包会在客户端处理高亮显示,所以调用Prism.highlightAll()并不重要。