我使用react-markdown
库并prismjs
在我的项目中突出显示代码。但是在我改变路线后突出显示并不总是有效。
例如,
- 我有markdown代码
TestPage
,浏览器中的url路径是localhost:3000/test
。
const markdown = `## How about some code?
\`\`\`js
var React = require('react');
var Markdown = require('react-markdown');
React.render(
<Markdown source="# Your markdown here" />,
document.getElementById('content')
);
\`\`\``;
- 如果我启动项目,默认的渲染页面是
localhost:3000
,当我跳转到路由localhost:3000/test
时,markdown语法有效,但代码高亮无效。呈现的 html 代码如下所示:
<h2>How about some code?</h2>
<pre>
<code class="language-js">
var React = require('react');
var Markdown = require('react-markdown');
React.render(
<Markdown source="# Your markdown here" />,
document.getElementById('content')
);
</code>
</pre>
- 如果我用 url 刷新页面
localhost:3000/test
,则突出显示有效。呈现的 html 代码如下所示:
<pre class=" language-js">
<code class=" language-js">
<span class="token keyword">var</span> React
<span class="token operator">=</span>
<span class="token function">require</span>
<!-- For simplify, I omit the left code -->
</code>
</pre>
- 但是,如果我路由到其他页面并返回到
testpage
,则代码突出显示将不再起作用。
为什么会这样?我想知道我的代码逻辑有什么问题。
下面的代码是我如何使用react-markdown
:
<ReactMarkdown source={markdown} renderers={{ CodeBlock }} />
代码块:
export default function CodeBlock({ language, value }) {
const codeEle = useRef(null);
useEffect(() => {
console.log('CodeBlock: useEffect');
Prism.highlightElement(codeEle, false);
}, [codeEle]);
return (
<pre>
<code ref={codeEle} className={`language-${language}`}>
{value}
</code>
</pre>
);
}
附言
- 我使用
react-router-dom
,Switch
在 App/index.js 中有一个
<Switch>
<Route exact path="/" component={HomePage} />
<Route path="/test" component={TestPage} />
</Switch>