Prism.js在React18中的使用

933 阅读2分钟

前言

我们在做一些个人博客或者技术社区的网站时,通常会使用到富文本编辑,这里我推荐一款很好用的富文本编辑器,由国人编写,完全免费,并且加入了开源社区:“wangEditor”,支持JS、、JQuery、Vue、React等,具体信息可点击了解wangEditor官方文档,wangEditor提供了代码块高亮等功能,内部基于Prism.js使用,Prism.js对代码块提供了丰富的功能,如代码高亮、代码块暗黑显示等,具体内容可点击了解Prism.js官方文档,下面介绍Prism.js在React18项目中的使用

在React18中使用

步骤一:首先安装prismjs库

npm install prismjs
# 或者 
yarn add prismjs

注:Prism.js的作用范围

要注意Prism.js的作用范围是页面中

<pre><code class="language-css">这里是Prism.js生效的区域</code></pre>

code标签中的类名“language-...”,省略的内容为代码片段语言类型,如果你使用wangEditor做富文本编辑,wangEditor会为你自动添加好该类名,无需手动操作

下面是一个例子:

<pre><code class="language-css">p { color: red }</code></pre>

如果想要代码标出行号效果,则需要在pre标签或其父元素加上类名“line-numbers”, 下面是一个例子

<div className="line-numbers">
<pre><code class="language-css">p { color: red }</code></pre>
</div>

步骤二:按需创建一个Code组件

将prismjs以及所需的css、js文件导入进去 下面是Code组件的一个例子

import React, { useEffect } from "react";

//导入prismjs包
import Prism from "prismjs";

//导入tomorrow代码主题样式(按需引入)
import "prismjs/themes/prism-tomorrow.min.css";

//导入行号效果css、js文件(按需引入)
import "prismjs/plugins/line-numbers/prism-line-numbers.min.css";
import "prismjs/plugins/line-numbers/prism-line-numbers.min.js";

const Code = ({ code, language }) => {
    useEffect(() => {
        Prism.highlightAll();
    }, []);

    return (
        <div className="line-numbers">
            <h2> Code Syntax Block {language}</h2>
            <pre>
                <code className={`language-${language}`}>{code}</code>
            </pre>
        </div>
    );
};

export default Code;

下面是App组件

import React from "react";
import Code from "./components/Code";

//JS测试代码
const JSCode = `const App = props => {
  return (
    <div>
      <h1> Prism JS </h1>
      <div>Awesome Syntax Highlighter</div>
    </div>
  );
};
`;

//html测试代码
const htmlCode = `
    <div>
      <h1> PrismJS Tutorial </h1>
      <p>
      Prism is a lightweight, extensible syntax highlighter, built with modern web standards in mind.
      </p>
    </div>
`;

function App() {
    return (
        <div className="App">
            <Code code={JSCode} language="javascript" />
            <Code code={htmlCode} language="html" />
        </div>
    );
}

export default App;

效果图:

prism.js-reactDemo.png

以上配置基本上可满足需求,如果有更高的需求,请参照Prism.js官方文档进行文件引入

注:动态获取数据配置方法

应设置Prism.highlightAll();为异步操作,在页面完成渲染之后,调用Prism.highlightAll();

下面是一个例子:

useEffect(() => {
        async function getItemArticle() {
            const resultPromise = await axios({
            
            //数据动态获取
                url: `http://127.0.0.1:3007/api/blog/${id}`,
                method: "get",
            });
            setItemArticle(resultPromise.data[0]);
            console.log("执行1");
            await setTimeout(() => {
            
            //获取到数据之后,进行页面渲染,渲染完成之后执行该异步操作
                Prism.highlightAll();
                console.log("执行2");
            }, 0);
        }
        getItemArticle();
    }, []);