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ù)自己的需要進行配置。我們創(chuàng)建一個 src/highlight.js 文件:
import hljs from 'highlight.js/lib/core';
// 導入需要的語言高亮
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;
在這個文件中,我們導入了需要使用的語言高亮,并注冊到了 highlight.js 中,最后導出了 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 對代碼塊進行了高亮,并創(chuàng)建了 Clipboard 實例,監(jiān)聽了復(fù)制成功事件。當點擊復(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ù)制的詳細內(nèi)容,更多關(guān)于React代碼高亮復(fù)制的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
react 項目 中使用 Dllplugin 打包優(yōu)化技巧
在用 Webpack 打包的時候,對于一些不經(jīng)常更新的第三方庫,比如 react,lodash,vue 我們希望能和自己的代碼分離開,這篇文章主要介紹了react 項目 中 使用 Dllplugin 打包優(yōu)化,需要的朋友可以參考下2023-01-01
React實現(xiàn)組件間通信的幾種方式小結(jié)
在React應(yīng)用中,組件間的通信是一個基礎(chǔ)而關(guān)鍵的概念,理解和掌握不同組件之間的通信方式,可以幫助我們構(gòu)建出更加模塊化、可維護和可擴展的應(yīng)用程序,React提供了多種組件通信的方法,本文給大家詳細的介紹了這些方法,需要的朋友可以參考下2024-07-07
將React+Next.js的項目部署到服務(wù)器的方法
本文詳細介紹了將React+Next.js項目部署到服務(wù)器的步驟,包括服務(wù)器環(huán)境準備、項目配置與構(gòu)建、啟動服務(wù)、配置Nginx反向代理、HTTPS配置、驗證與監(jiān)控以及高級優(yōu)化,感興趣的朋友一起看看吧2025-03-03
React結(jié)合Drag?API實現(xiàn)拖拽示例詳解
這篇文章主要為大家介紹了React結(jié)合Drag?API實現(xiàn)拖拽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
解決React報錯Property does not exist on 
這篇文章主要為大家介紹了React報錯Property does not exist on type 'JSX.IntrinsicElements'解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
React-Native實現(xiàn)ListView組件之上拉刷新實例(iOS和Android通用)
本篇文章主要介紹了React-Native實現(xiàn)ListView組件之上拉刷新實例(iOS和Android通用),具有一定的參考價值,有興趣的可以了解一下2017-07-07

