如何在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结合

相关推荐
玩电脑的辣条哥2 小时前
Python如何播放本地音乐并在web页面播放
开发语言·前端·python
ew452183 小时前
ElementUI表格表头自定义添加checkbox,点击选中样式不生效
前端·javascript·elementui
suibian52353 小时前
AI时代:前端开发的职业发展路径拓宽
前端·人工智能
Moon.93 小时前
el-table的hasChildren不生效?子级没数据还显示箭头号?树形数据无法展开和收缩
前端·vue.js·html
垚垚 Securify 前沿站3 小时前
深入了解 AppScan 工具的使用:筑牢 Web 应用安全防线
运维·前端·网络·安全·web安全·系统安全
工业甲酰苯胺5 小时前
Vue3 基础概念与环境搭建
前端·javascript·vue.js
mosquito_lover17 小时前
怎么把pyqt界面做的像web一样漂亮
前端·python·pyqt
柴柴的小记9 小时前
前端vue引入特殊字体不生效
前端·javascript·vue.js
Aphelios3809 小时前
Linux 下 VIM 编辑器学习记录:从基础到进阶(上)
java·linux·编辑器·vim
柠檬豆腐脑9 小时前
从前端到全栈:新闻管理系统及多个应用端展示
前端·全栈