最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React使用highlight.js Clipboard.js實現(xiàn)代碼高亮復制

 更新時間:2023年04月24日 09:31:59   作者:黃娟  
這篇文章主要為大家介紹了React使用highlight.js Clipboard.js實現(xiàn)代碼高亮復制功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

在網(wǎng)頁開發(fā)中,代碼高亮和復制功能是十分常見的需求。為了讓界面更加美觀,我們通常會使用一些成熟的庫來實現(xiàn)這些功能,避免自己手寫復雜的代碼。而在 React 中,常用的代碼高亮庫是 highlight.js,常用的復制庫是 Clipboard.js。本篇文章將介紹如何在 React 中使用這兩個庫,實現(xiàn)代碼高亮和復制功能。

安裝 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)聽復制成功事件
      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 ? '已復制' : '復制'}
      </button>
    </div>
  );
}

在這個組件中,我們使用了 useRef 和 useEffect 鉤子,分別保存了代碼塊的 DOM 對象和復制按鈕的 Clipboard 對象。在 useEffect 中,我們使用 highlight.js 對代碼塊進行了高亮,并創(chuàng)建了 Clipboard 實例,監(jiān)聽了復制成功事件。當點擊復制按鈕后,會將代碼塊的內容復制到剪貼板中,并在按鈕上顯示“已復制”,2 秒后消失。最后,我們將代碼塊和復制按鈕顯示在了頁面上。

使用 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>
  );
}

效果展示

參考

GitHub源碼

以上就是React使用highlight.js Clipboard.js實現(xiàn)代碼高亮復制的詳細內容,更多關于React代碼高亮復制的資料請關注腳本之家其它相關文章!

相關文章

  • react 項目 中使用 Dllplugin 打包優(yōu)化技巧

    react 項目 中使用 Dllplugin 打包優(yōu)化技巧

    在用 Webpack 打包的時候,對于一些不經常更新的第三方庫,比如 react,lodash,vue 我們希望能和自己的代碼分離開,這篇文章主要介紹了react 項目 中 使用 Dllplugin 打包優(yōu)化,需要的朋友可以參考下
    2023-01-01
  • React中Context的用法總結

    React中Context的用法總結

    Context?提供了一種在組件樹中共享數(shù)據(jù)的方式,而不必通過?props?顯式地逐層傳遞,主要用于共享那些對于組件樹中許多組件來說是"全局"的數(shù)據(jù),下面小編就來和大家簡單講講Context的用法吧
    2025-01-01
  • 深入理解React高階組件

    深入理解React高階組件

    本篇文章主要介紹了深入理解React高階組件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • React實現(xiàn)組件間通信的幾種方式小結

    React實現(xiàn)組件間通信的幾種方式小結

    在React應用中,組件間的通信是一個基礎而關鍵的概念,理解和掌握不同組件之間的通信方式,可以幫助我們構建出更加模塊化、可維護和可擴展的應用程序,React提供了多種組件通信的方法,本文給大家詳細的介紹了這些方法,需要的朋友可以參考下
    2024-07-07
  • 將React+Next.js的項目部署到服務器的方法

    將React+Next.js的項目部署到服務器的方法

    本文詳細介紹了將React+Next.js項目部署到服務器的步驟,包括服務器環(huán)境準備、項目配置與構建、啟動服務、配置Nginx反向代理、HTTPS配置、驗證與監(jiān)控以及高級優(yōu)化,感興趣的朋友一起看看吧
    2025-03-03
  • React狀態(tài)管理的簡明指南

    React狀態(tài)管理的簡明指南

    Redux 是React最常用的集中狀態(tài)管理工具,本文主要介紹了React狀態(tài)管理的簡明指南,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • React結合Drag?API實現(xiàn)拖拽示例詳解

    React結合Drag?API實現(xiàn)拖拽示例詳解

    這篇文章主要為大家介紹了React結合Drag?API實現(xiàn)拖拽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 解決React報錯Property does not exist on type 'JSX.IntrinsicElements'

    解決React報錯Property does not exist on 

    這篇文章主要為大家介紹了React報錯Property does not exist on type 'JSX.IntrinsicElements'解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • React中的axios模塊及使用方法

    React中的axios模塊及使用方法

    axios 是一個基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中,本文給大家分享React中axios模塊的使用方法,感興趣的朋友一起看看吧
    2022-03-03
  • React-Native實現(xiàn)ListView組件之上拉刷新實例(iOS和Android通用)

    React-Native實現(xiàn)ListView組件之上拉刷新實例(iOS和Android通用)

    本篇文章主要介紹了React-Native實現(xiàn)ListView組件之上拉刷新實例(iOS和Android通用),具有一定的參考價值,有興趣的可以了解一下
    2017-07-07

最新評論

大悟县| 拉萨市| 建始县| 朔州市| 南靖县| 黄石市| 繁峙县| 佛教| 当雄县| 永年县| 永靖县| 基隆市| 通江县| 乌拉特中旗| 洛南县| 天全县| 林西县| 沅江市| 家居| 大方县| 仁化县| 望都县| 星子县| 井陉县| 南岸区| 昭苏县| 韶关市| 保山市| 岱山县| 小金县| 林周县| 蓝田县| 德惠市| 南靖县| 文登市| 曲松县| 丘北县| 牟定县| 高阳县| 宝鸡市| 册亨县|