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-03react同構(gòu)實踐之實現(xiàn)自己的同構(gòu)模板
這篇文章主要介紹了react同構(gòu)實踐之實現(xiàn)自己的同構(gòu)模板,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03React18使用Echarts和MUI實現(xiàn)一個交互性的溫度計
這篇文章我們將結(jié)合使用React 18、Echarts和MUI(Material-UI)庫,展示如何實現(xiàn)一個交互性的溫度計,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01