@amoayun/monaco-editor-vue3
A Vue3 component based on monaco-editor, supporting code comparison, two-way data binding, and custom suggestions, etc.
2,922
| Install | |
|---|---|
npm install @amoayun/monaco-editor-vue3 |
|
| Latest Version: | 1.0.20 |
| Vue: | 3 |
| License: | MIT |
| Last Updated: | Dec 20, 2025 |
| Links: | GitHub · npm |
Maintainer: shangguanjunwei
Feature Support
- ✅ ✨Two modes:
diff(code comparison editor),base(regular code editor) - ✅ ✨Two-way data binding: supports
v-model,v-model:originalData,v-model:modifiedData - ✅ ✨Multiple themes:
vs,vs-dark,hc-black,hc-light - ✅ ✨Multiple language highlighting: JSON, CSS, SCSS, LESS, HTML, TypeScript, JavaScript, etc.
- ✅ ✨Multiple language code suggestions and customizable code suggestions
- ✅ ✨Insert text
- ✅ ✨Real-time content selection
- ✅ ✨Elimination of monaco-editor side effects
- More features can be experienced in the Online Demo
Online Demo
For more features, please visit the Online Demo
Quick Start
- Install dependencies
npm i @amoayun/monaco-editor-vue3
- The component relies on Microsoft's
monaco-editor, so you need to install it
npm i monaco-editor
-
Code Import
Note: In diff mode, you need to pass two v-model values: originalData and modifiedData, instead of the default modelValue (see Props in the Advanced Usage section for details).
<template>
<div>
<AmoAYunMonacoEditorVue3 v-model="content" language="javascript" style="width: 100%;height: 400px;" />
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import { AmoAYunMonacoEditorVue3 } from "@amoayun/monaco-editor-vue3";
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) {
switch (label) {
case "json":
return new jsonWorker();
case "css":
case "scss":
case "less":
return new cssWorker();
case "html":
case "handlebars":
case "razor":
return new htmlWorker();
case "typescript":
case "javascript":
return new tsWorker();
default:
return new editorWorker();
}
},
};
const content = ref("");
</script>
Advanced Usage
Props
| Name | Description | Type | Default | Version |
|---|---|---|---|---|
modelValue (v-model) |
Bound value (base mode) | string | - | - |
originalData (v-model) |
Bound value (diff mode) | string | - | - |
modifiedData (v-model) |
Bound value (diff mode) | string | - | - |
| mode | Editor mode | 'diff' | 'base' | 'base' | - |
| language | Editor language | string | "javascript" | - |
| theme | Editor theme | "vs" | "vs-dark" | "hc-black" | "hc-light" | "vs-dark" | - |
| placeholder | Placeholder text | string | - | - |
| disabled | Disabled state | base mode: boolean diff mode: [boolean, boolean] |
- | - |
| config | Code editor configuration | ConfigOptions (see Type below) | - | - |
| diySuggest | Custom suggestions | SuggestItemOptions[] (see Type below) | - | - |
Events
| Event Name | Description | Parameter |
|---|---|---|
| select | Select content in the editor | value:string |
- Example Usage:
<template>
<div>
<AmoAYunMonacoEditorVue3 v-model="content" language="javascript" style="width: 100%;height: 400px;" @select="handleSelect" />
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import { AmoAYunMonacoEditorVue3 } from "@amoayun/monaco-editor-vue3";
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) {
switch (label) {
case "json":
return new jsonWorker();
case "css":
case "scss":
case "less":
return new cssWorker();
case "html":
case "handlebars":
case "razor":
return new htmlWorker();
case "typescript":
case "javascript":
return new tsWorker();
default:
return new editorWorker();
}
},
};
const content = ref("");
const handleSelect = (value: string) => {
console.log(value);
};
</script>
Methods
| Method Name | Description | Parameter | Return | Version |
|---|---|---|---|---|
| insertText | Insert content (only available in base mode) | field:string | - | - |
- Example Usage:
<template>
<div>
<AmoAYunMonacoEditorVue3 v-model="content" language="javascript" style="width: 100%;height: 400px;" ref="editor" />
<button @click="handleInsert">Insert Content</button>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import { AmoAYunMonacoEditorVue3 } from "@amoayun/monaco-editor-vue3";
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) {
switch (label) {
case "json":
return new jsonWorker();
case "css":
case "scss":
case "less":
return new cssWorker();
case "html":
case "handlebars":
case "razor":
return new htmlWorker();
case "typescript":
case "javascript":
return new tsWorker();
default:
return new editorWorker();
}
},
};
const content = ref<string>("");
const editor = ref<any>(null);
const handleInsert = () => {
editor.value?.insertText("hello world");
};
</script>
Type
ConfigOptions
| Name | Description | Type | Default | Version |
|---|---|---|---|---|
| autoIndent | Auto indentation | "brackets" | "none" | "keep" | "advanced" | "full" | "brackets" | - |
| contextmenu | Right-click menu | boolean | false | - |
| autoClosingBrackets | Auto closing brackets | "always" | "languageDefined" | "beforeWhitespace" | "never" | "always" | - |
| automaticLayout | Automatic layout | boolean | true | - |
| cursorBlinking | Cursor style | "blink" | "smooth" | "phase" | "expand" | "solid" | "expand" | - |
| dragAndDrop | Allow content drag and drop | boolean | true | - |
| extraEditorClassName | Additional editor class name | string | "amoayun-monaco-editor" | - |
| fixedOverflowWidgets | Fixed overflow widgets | boolean | true | - |
| glyphMargin | Show line number margin | boolean | false | - |
| lineNumbers | Display line numbers | "on" | "off" | "relative" | "interval" | "on" | - |
| matchBrackets | Highlight matching brackets | "never" | "near" | "always" | "always" | - |
| overviewRulerBorder | Show overview ruler border | boolean | true | - |
| scrollBeyondLastLine | Allow scrolling beyond the last line | boolean | false | - |
| showDeprecated | Show deprecated code | boolean | false | - |
| showFoldingControls | Folding controls display | "always" | "never" | "mouseover" | "always" | - |
| unfoldOnClickAfterEndOfLine | Unfold on end of line click | boolean | true | - |
| smoothScrolling | Enable smooth scrolling | boolean | true | - |
| tabCompletion | Enable tab completion | "on" | "off" | "onlySnippets" | "on" | - |
| wordWrap | Word wrapping | "off" | "on" | "wordWrapColumn" | "bounded" | "off" | - |
SuggestItemOptions
| Name | Description | Type | Default | Version |
|---|---|---|---|---|
| label | Keyword | string | - | - |
| kind | Suggestion type | number | 17 | - |
| insertText | Text to insert for the keyword | string | Uses insertText value first, label second | - |
| detail | Brief description | string | - | - |
| documentation | Detailed description | string | - | - |
Related Packages
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 1.0.20 | ^3.5.13 | MIT | |
| 1.0.19 | ^3.5.13 | MIT | |
| 1.0.18 | ^3.5.13 | MIT | |
| 1.0.17 | ^3.5.13 | MIT | |
| 1.0.16 | ^3.5.13 | MIT | |
| 1.0.15 | ^3.5.13 | ||
| 1.0.14 | ^3.5.13 | ||
| 1.0.13 | ^3.5.13 | ||
| 1.0.12 | ^3.5.13 | ||
| 1.0.11 | ^3.5.13 | ||
| 1.0.9 | ^3.5.13 | ||
| 1.0.7 | ^3.5.13 | ||
| 1.0.5 | ^3.5.13 | ||
| 1.0.4 | ^3.5.13 | ||
| 1.0.3 | ^3.5.13 | ||
| 1.0.2 | ^3.5.13 | ||
| 1.0.1 | ^3.5.13 |