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

相关推荐
Smile_Gently2 小时前
前端:最简单封装nmp插件(组件)过程。
前端·javascript·vue.js·elementui·vue
艾斯比的日常8 小时前
VSCode 实用快捷键
ide·vscode·编辑器
Galaxy_12298 小时前
vscode远程报错:Remote host key has changed,...
ide·vscode·编辑器
luckycoke8 小时前
小程序立体轮播
前端·css·小程序
一 乐9 小时前
高校体育场管理系统系统|体育场管理系统小程序设计与实现(源码+数据库+文档)
前端·javascript·数据库·spring boot·高校体育馆系统
懒羊羊我小弟9 小时前
常用Webpack Loader汇总介绍
前端·webpack·node.js
祈澈菇凉9 小时前
ES6模块的异步加载是如何实现的?
前端·javascript·es6
我爱学习_zwj9 小时前
4.从零开始学会Vue--{{组件通信}}
前端·javascript·vue.js·笔记·前端框架
顾比魁9 小时前
XSS盲打:当攻击者“盲狙”管理员
前端·网络安全·xss
黑客老李9 小时前
新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)
java·运维·服务器·前端·xss