Juste installé React Monaco Editor et semble fonctionner correctement sauf qu'il n'y a pas de coloration syntaxique. J'essaye d'utiliser "python" comme langue mais la police reste la même couleur grise par défaut:
Des idées sur la façon de corriger le problème?
Voici mon Code.js où j'exécute l'éditeur Monaco:
import React from "react";
import MonacoEditor from "react-monaco-editor";
class Code extends React.Component {
constructor(props) {
super(props);
this.state = {
code: 'print("Hello, World!")'
};
}
editorDidMount(editor, monaco) {
console.log("editorDidMount", editor);
editor.focus();
}
onChange(newValue, e) {
console.log("onChange", newValue, e);
}
render() {
const code = this.state.code;
const options = {
selectOnLineNumbers: true,
fontSize: 18,
colorDecorators: true
};
return (
<MonacoEditor
width="800"
height="600"
language="python"
theme="vs-dark"
value={code}
options={options}
onChange={this.onChange}
editorDidMount={this.editorDidMount}
/>
);
}
}
export default Code;
J'ai également ajouté ce code en haut de webpack.config.js:
const path = require('path');
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
module.exports = {
plugins: [
new MonacoWebpackPlugin({
// available options are documented at https://github.com/Microsoft/monaco-editor-webpack-plugin#options
languages: ['python']
})
]
};
const APP_DIR = path.resolve(__dirname, './src');
const MONACO_DIR = path.resolve(__dirname, './node_modules/monaco-editor');
module.exports = {
test: /\.css$/,
include: APP_DIR,
use: [{
loader: 'style-loader',
}, {
loader: 'css-loader',
options: {
modules: true,
namedExport: true,
},
}],
}, {
test: /\.css$/,
include: MONACO_DIR,
use: ['style-loader', 'css-loader'],
}
Pour moi, les deux réponses ci-dessus ne fonctionnent pas - je ne sais pas si cela est lié à Codesandbox ou si j'ai fait une erreur.
Mais utiliser @ monaco-editor/react fonctionne sans aucune modification de la configuration de l'ARC.
La seule différence dans l'utilisation est que l'exportation par défaut n'est pas un composant contrôlé - donc onchange
ne fonctionne pas.
Pour avoir un composant contrôlé, utilisez simplement import {ControlledEditor as MonacoEditor} from "@monaco-editor/react"
. Le gestionnaire onchange
doit être légèrement modifié, d'abord l'événement et ensuite le newText
- juste une petite différence dans l'implémentation.
L'utilisation ressemble à ceci:
import React, { useState } from "react";
import { ControlledEditor as MonacoEditor } from "@monaco-editor/react";
export const Editor = () => {
const [code, setCode] = useState(`const greeting = () => {
alert("Hello world");
}`);
const options = {
minimap: {
enabled: false
}
};
const changeHandler = (evt, newText) => {
setCode(newText);
};
const editorDidMount = (editor, monaco) => {
console.log("editorDidMount", editor);
};
return (
<MonacoEditor
width="100%"
height="100%"
language="javascript"
theme="vs-dark"
value={code}
options={options}
onChange={changeHandler}
editorDidMount={editorDidMount}
/>
);
};
Le options
peut être utilisé pour modifier l'éditeur Monaco. Dans mon cas, je ne veux pas afficher la mini-carte. Toutes les options disponibles se trouvent dans le editor api docs
Vous pouvez trouver la démo de travail dans ce Codesandbox .
La seule chose que j'ai trouvée qui ne fonctionne pas est annuler/refaire comme décrit dans ce qui suit issue . Aucun événement de changement n'a été déclenché mais je vérifierai cela plus tard - pour l'instant j'en suis satisfait.