1- import React , { Component } from "react" ;
2- import PropTypes from "prop-types" ;
3-
4- import hljs from "highlight.js" ;
5- import "highlight.js/styles/monokai-sublime.css" ;
6-
7- const registeredLanguages = { } ;
8-
9- class Highlight extends Component {
10- constructor ( props ) {
11- super ( props ) ;
12-
13- this . state = { loaded : false } ;
14- this . codeNode = React . createRef ( ) ;
15- }
16-
17- componentDidMount ( ) {
18- const { language } = this . props ;
19-
20- if ( language && ! registeredLanguages [ language ] ) {
21- try {
22- const newLanguage = require ( `highlight.js/lib/languages/${ language } ` ) ;
23- hljs . registerLanguage ( language , newLanguage ) ;
24- registeredLanguages [ language ] = true ;
25-
26- this . setState ( { loaded : true } , this . highlight ) ;
27- } catch ( e ) {
28- console . error ( e ) ;
29- throw Error ( `Cannot register the language ${ language } ` ) ;
30- }
31- } else {
32- this . setState ( { loaded : true } ) ;
33- }
34- }
35-
36- componentDidUpdate ( ) {
37- this . highlight ( ) ;
38- }
39-
40- highlight = ( ) => {
41- this . codeNode &&
42- this . codeNode . current &&
43- hljs . highlightBlock ( this . codeNode . current ) ;
44- } ;
45-
46- render ( ) {
47- const { language, children } = this . props ;
48- const { loaded } = this . state ;
49-
50- if ( ! loaded ) {
51- return null ;
52- }
53-
54- return (
55- < pre className = "rounded" >
56- < code ref = { this . codeNode } className = { language } >
57- { children }
58- </ code >
59- </ pre >
60- ) ;
61- }
62- }
63-
64- Highlight . propTypes = {
65- children : PropTypes . node . isRequired ,
66- language : PropTypes . string ,
67- } ;
68-
69- Highlight . defaultProps = {
70- language : "json" ,
1+ import React , { useEffect , useRef } from 'react' ;
2+
3+ import hljs from 'highlight.js' ;
4+ import 'highlight.js/styles/monokai-sublime.css' ;
5+
6+ const Highlight = ( props ) => {
7+ const { text, language = 'json' } = props ;
8+
9+ const codeNode = useRef ( null ) ;
10+ useEffect ( ( ) => {
11+ hljs . highlightElement ( codeNode . current ) ;
12+ } , [ text ] ) ;
13+
14+ return (
15+ < pre className = "rounded" >
16+ < code ref = { codeNode } className = { language } >
17+ { text }
18+ </ code >
19+ </ pre >
20+ ) ;
7121} ;
7222
73- export default Highlight ;
23+ export default Highlight ;
0 commit comments