html部分
<template>
<div id="root" ref="root"></div>
</div>
</template>
TS部分
<script lang="ts">
import {
defineComponent,
ref,
onMounted,
onUnmounted,
reactive,
nextTick,
watch
} from 'vue';
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';
import store from '@/store/editor';
self.MonacoEnvironment = {
getWorker(_: string, label: string) {
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();
}
};
export default defineComponent({
props: {
defaultValue: String
},
emits: { contentChange: null },
setup(props, context) {
const estore = store();
let theme = ref(estore.$state.theme);
const root = ref<HTMLElement>();
let editor: monaco.editor.IStandaloneCodeEditor;
const property = reactive({
language: 'javascript',
fullscreen: false
});
onMounted(() => {
nextTick(() => {
editor = monaco.editor.create(root.value as HTMLElement, {
language: property.language,
value: props.defaultValue,
theme: theme.value === 'light' ? 'vs' : 'vs-dark'
});
editor.onDidChangeModelContent(() => {
context.emit('contentChange', editor.getValue());
});
});
});
onUnmounted(() => {
editor.dispose();
});
watch(
() => props.defaultValue,
(val) => {
editor.setValue(val);
}
);
watch(theme, (val) => {
if (val === 'light') {
monaco.editor.setTheme('vs');
} else if (val === 'dark') {
monaco.editor.setTheme('vs-dark');
}
});
const languageChange = (value: string) => {
property.language = value;
monaco.editor.setModelLanguage(editor.getModel(), value);
};
const screenChange = (value: any) => {
property.fullscreen = value;
if (value) {
editor.layout({
height: document.body.clientHeight,
width: document.body.clientWidth
});
} else {
nextTick(() => {
editor.layout({
height: document.querySelector('.m-edtior-container')
?.offsetHeight as number,
width: document.querySelector('.m-edtior-container')
?.offsetWidth as number
});
});
}
};
return {
root,
languageChange,
property,
screenChange
};
}
});
</script>