React使用highlight.js Clipboard.js實現(xiàn)代碼高亮復(fù)制
正文
在網(wǎng)頁開發(fā)中,代碼高亮和復(fù)制功能是十分常見的需求。為了讓界面更加美觀,我們通常會使用一些成熟的庫來實現(xiàn)這些功能,避免自己手寫復(fù)雜的代碼。而在 React 中,常用的代碼高亮庫是 highlight.js,常用的復(fù)制庫是 Clipboard.js。本篇文章將介紹如何在 React 中使用這兩個庫,實現(xiàn)代碼高亮和復(fù)制功能。
安裝 highlight.js 和 Clipboard.js
首先,在我們的 React 項目中安裝 highlight.js 和 Clipboard.js:
npm install highlight.js clipboard --save
安裝完成后,我們就可以在 React 中使用這兩個庫了。
配置 highlight.js 支持的語言
highlight.js 支持很多種語言的代碼高亮,我們需要配置支持的語言。在本例中,我們只演示部分語言的高亮,可根據(jù)自己的需要進(jìn)行配置。我們創(chuàng)建一個 src/highlight.js 文件:
import hljs from 'highlight.js/lib/core';
// 導(dǎo)入需要的語言高亮
import java from 'highlight.js/lib/languages/java';
import csharp from 'highlight.js/lib/languages/csharp';
import php from 'highlight.js/lib/languages/php';
import python from 'highlight.js/lib/languages/python';
import objectivec from 'highlight.js/lib/languages/objectivec';
import bash from 'highlight.js/lib/languages/bash';
hljs.registerLanguage('java', java);
hljs.registerLanguage('csharp', csharp);
hljs.registerLanguage('php', php);
hljs.registerLanguage('python', python);
hljs.registerLanguage('objectivec', objectivec);
hljs.registerLanguage('bash', bash);
export default hljs;
在這個文件中,我們導(dǎo)入了需要使用的語言高亮,并注冊到了 highlight.js 中,最后導(dǎo)出了 hljs 對象。這樣,我們就可以在 React 中方便地使用 highlight.js 了。
創(chuàng)建 CodeBlock 組件
我們創(chuàng)建一個 src/components/CodeBlock/index.js 文件,實現(xiàn) CodeBlock 組件:
import React, { useEffect, useRef, useState } from 'react';
import hljs from '../../highlight';
import Clipboard from 'clipboard';
import 'highlight.js/styles/default.css';
export default function CodeBlock({ language, code }) {
const preRef = useRef(null);
const [copied, setCopied] = useState(false);
useEffect(() => {
if (preRef.current) {
hljs.highlightBlock(preRef.current);
// 創(chuàng)建 clipboard 實例并保存到變量中
const clipboard = new Clipboard(`#${language}copy_btn`, {
text: () => code,
});
// 監(jiān)聽復(fù)制成功事件
clipboard.on('success', () => {
setCopied(true);
setTimeout(() => setCopied(false), 2000);
});
// 銷毀 clipboard 實例
return () => {
clipboard.destroy();
};
}
}, [code]);
return (
<div className="code-block" style={{ position: 'relative', marginTop: 8 }}>
<pre>
<code id={language} ref={preRef} className={language}>
[code]
</code>
</pre>
<button id={`${language}copy_btn`} style={{ position: 'absolute', top: 4, right: 4, lineHeight: '14px' }} className="code-block__button" data-clipboard-target={`#${language}`} disabled={!preRef.current}>
{copied ? '已復(fù)制' : '復(fù)制'}
</button>
</div>
);
}
在這個組件中,我們使用了 useRef 和 useEffect 鉤子,分別保存了代碼塊的 DOM 對象和復(fù)制按鈕的 Clipboard 對象。在 useEffect 中,我們使用 highlight.js 對代碼塊進(jìn)行了高亮,并創(chuàng)建了 Clipboard 實例,監(jiān)聽了復(fù)制成功事件。當(dāng)點擊復(fù)制按鈕后,會將代碼塊的內(nèi)容復(fù)制到剪貼板中,并在按鈕上顯示“已復(fù)制”,2 秒后消失。最后,我們將代碼塊和復(fù)制按鈕顯示在了頁面上。
使用 CodeBlock 組件
import React from 'react';
import CodeBlock from '../components/CodeBlock';
export default function BlogPost() {
const code = `
public static void main(String[] args) {
System.out.println("Hello, World!");
}
`;
return (
<div>
<h2>這是一篇博客文章</h2>
<p>下面是一段 Java 代碼:</p>
<CodeBlock language="java" code=[code] />
</div>
);
}
效果展示

參考
以上就是React使用highlight.js Clipboard.js實現(xiàn)代碼高亮復(fù)制的詳細(xì)內(nèi)容,更多關(guān)于React代碼高亮復(fù)制的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
react hooks使用Echarts圖表中遇到的情況及相關(guān)配置問題
這篇文章主要介紹了react hooks使用Echarts圖表中遇到的情況及相關(guān)配置問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
react同構(gòu)實踐之實現(xiàn)自己的同構(gòu)模板
這篇文章主要介紹了react同構(gòu)實踐之實現(xiàn)自己的同構(gòu)模板,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
React18使用Echarts和MUI實現(xiàn)一個交互性的溫度計
這篇文章我們將結(jié)合使用React 18、Echarts和MUI(Material-UI)庫,展示如何實現(xiàn)一個交互性的溫度計,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01

