如何在react中使用react-monaco-editor渲染出一个编辑器

一、效果展示

二、基于vite配置

1.首先安装react-monaco-editor和monaco-editor包

复制代码
npm add react-monaco-editor

npm i monaco-editor

2.其次创建一个单独的文件(此处是tsx、直接用app或者jsx也行)

javascript 复制代码
import { useState, useEffect } from 'react'
import MonacoEditor from 'react-monaco-editor'
import './worker'

type Props = {
  jsonCode: any
}

const editor: React.FC<Props> = (props) => {
  //配置项
  const options = {
    readOnly:true,
    selectOnLineNumbers:true,
    matchBrackets:'near' as const
  }
  //json代码
  const [jsonCode, setJsonCode] = useState('{}')
  //渲染获取到的json代码
  useEffect(() => {
    if (props.jsonCode) {
      setJsonCode(JSON.stringify(JSON.parse(props.jsonCode), null, 2))
    }
  }, [props.jsonCode])
  //改变代码时触发
  const handleJsonCodeChange = (e: any) => {
    setJsonCode(e)
    console.log(jsonCode,'jsoncode代码同步')
  }

  return (
    <>
      <h2>真实数据(开发人员可以直接编辑)</h2>
      <MonacoEditor
        width="100%"
        height="500"
        language="json"
        theme="vs-dark"
        defaultValue='{}'
        value={jsonCode}
        onChange={handleJsonCodeChange}
        options={options}
        >
      </MonacoEditor>
    </>

  )
}

export default editor

接下来将此文件作为组件在其他组件中正常使用即可

根据MonacoEditor自带的配置项可以看出MonacoEditor还有非常多灵活的用法

3.如何高亮显示代码

javascript 复制代码
import * as monaco from 'monaco-editor'
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'
// import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker"
// import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker"
// import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker"

self.MonacoEnvironment = {
  getWorker(_, label) {
    if (label === 'json') {
      return new jsonWorker()
    }
    // if (label === "css" || label === "scss" || label === "less") {
    //   return new cssWorker()
    // }
    // if (label === "html" || label === "handlebars" || label === "razor") {
    //   return new htmlWorker()
    // }
    // if (label === "typescript" || label === "javascript") {
    //   return new tsWorker()
    // }
    return new editorWorker()
  }
}

monaco.languages.typescript.typescriptDefaults.setEagerModelSync(true)

上方代码就是我 MonacoEditor组件中的worker.ts代码,直接引入到MonacoEditor组件中即可

三、官方文档中配置方式

react-monaco-editor的官方文档:

https://github.com/react-monaco-editor/react-monaco-editor/blob/master/README.md

1.和create-react-app结合

首先安装依赖

javascript 复制代码
npm i -D react-monaco-editor react-app-rewired

其次将项目中package.json文件中的react-scripts替换为react-app-rewired

最后在项目根目录中创建一个config-overrides.js

javascript 复制代码
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');

module.exports = function override(config, env) {
  config.plugins.push(new MonacoWebpackPlugin({
    languages: ['json']
  }));
  return config;
}

2.和webpack结合

相关推荐
你真的可爱呀3 小时前
uniapp+vue3项目中的常见报错情况以及解决方法
前端·vue.js·uni-app
差点GDP7 小时前
模拟请求测试 Fake Rest API Test
前端·网络·json
酒尘&8 小时前
Hook学习-上篇
前端·学习·react.js·前端框架·react
houyhea8 小时前
从香港竹脚手架到前端脚手架:那些"借来"的发展智慧与安全警示
前端
哈哈~haha8 小时前
Step 14: Custom CSS and Theme Colors 自定义CSS类
前端·css·ui5
Ndmzi8 小时前
Matlab编程技巧:自定义Simulink菜单(理解补充)
前端·javascript·python
我命由我123459 小时前
VSCode - VSCode 修改文件树缩进
前端·ide·vscode·前端框架·编辑器·html·js
SoaringHeart9 小时前
Flutter组件封装:验证码倒计时按钮 TimerButton
前端·flutter
San30.9 小时前
深入理解 JavaScript OOP:从一个「就地编辑组件」看清封装、状态与原型链
开发语言·前端·javascript·ecmascript
AAA阿giao10 小时前
JavaScript 原型与原型链:从零到精通的深度解析
前端·javascript·原型·原型模式·prototype·原型链