javascript - 如何在react中加载自定义prismjs语法文件?

标签 javascript reactjs syntax-highlighting prismjs

问题描述:如何在 React 项目中使用 prismjs 突出显示自定义语法?

我按照guide创建了一个扩展语法文件(我们称之为newlang)。 。

我知道在 prismjs 中有三种方法可以突出显示代码:

  • highlightElement()
  • highlightAll()
  • 突出显示()

首先,我尝试在我的应用程序中要求自定义语法文件。

导入 'utils/highlight/prism-newlang';

然后,在我的突出显示组件中,

  • 方法 1:highlightElement():❌无法突出显示我的代码
import Prism from 'prismjs';

function CodeHighlight({ value, language }) {
  const codeEle = useRef(null);

  useEffect(() => {
    Prism.highlightElement(codeEle.current, false);
  }, []);

  return (
    <pre className={`language-${language}`}>
      <code ref={codeEle} className={`language-${language}`}>
        {value}
      </code>
    </pre>
  );
}
  • 方法 2:highlightAll():❌无法突出显示我的代码
  • 方法 3:highlight():✅可以突出显示我的代码
import { highlight, languages } from 'prismjs/components/prism-core';

function CodeHighlight({ value, language }) {
  const codeNode = useRef(null);

  useEffect(() => {
    const code = codeNode.current.textContent;
    const highlightHTML = highlightCode(code, language);
    codeNode.current.innerHTML = highlightHTML;
  });

  return (
    <pre className={`language-${language}`}>
      <code ref={codeNode} className={`language-${language}`}>
        {value}
      </code>
    </pre>
  );
}

我想知道方法1和2有什么问题。(会是自定义语法文件加载顺序的问题吗?)

最佳答案

对于那些将来遇到这个问题的人,我能够让第一种方法发挥作用。就我而言,我在handleChange 中调用了Prism.highlight,它在使用internalText 更新DOM 之前就调用了该函数。我现在使用 useEffect 钩子(Hook),它在 DOM 渲染后调用,技巧是您需要将 internalText 声明为订阅参数。

我已附加我的 Typescript 组件。

希望这有帮助。

import React, { useState, ChangeEvent, useRef, useEffect } from 'react'
import './prism.css'
import Prism from "prismjs";

export function CodeBlockTile() {
  const language = "javascript"

  const codeElement = useRef<HTMLElement | null>(null);
  const [internalText, setInternalText] = useState<string>("")

  const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {
    setInternalText(event.target.value);
  };

  useEffect(() => {
    if (codeElement.current) {
      Prism.highlightElement(codeElement.current)
    }
  }, [internalText])


  return (
    <div>
      <textarea onChange={handleChange} value={internalText}>

      </textarea>
      <pre>
        <code ref={codeElement} className={`language-${language}`}>
          {internalText}
        </code>
      </pre>
    </div>
  )
}

关于javascript - 如何在react中加载自定义prismjs语法文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58456263/

相关文章:

javascript - 模拟链接单击而不与 jquery 中的用户交互?

javascript - 是否可以将 'number of chosen checkboxes limitation'以多种形式放入循环中?

javascript - 生成加权随机数

javascript - 如何创建一个扩展 React.Component 的 BaseClass,以便我的所有其他类都扩展 BaseClass 并可以指定自己的 Props 和 State 类型?

javascript - React JSX 代码未编译

javascript - Grails javascript 文件重新加载

javascript/react 动态高度文本区域(停在最大值处)

vim 隐藏多个字符

java - Eclipse 语法突出显示 Java Struts Hibernate Web 应用程序

c++ - Qt5:告诉 QPlainTextEdit 忽略语法高亮更改