|
|
@@ -0,0 +1,88 @@
|
|
|
+<script setup lang="ts">
|
|
|
+import {defineProps, nextTick, onMounted, ref} from "vue";
|
|
|
+import {useVModel} from "@vueuse/core";
|
|
|
+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 EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
|
|
|
+import * as monaco from 'monaco-editor';
|
|
|
+import sleep from "@/utils/sleep";
|
|
|
+
|
|
|
+
|
|
|
+const props = defineProps<{
|
|
|
+ jsData: string,
|
|
|
+ modelValue: boolean
|
|
|
+}>()
|
|
|
+
|
|
|
+const dialog = ref(true)
|
|
|
+const emits = defineEmits(['update:modelValue', 'update:jsData'])
|
|
|
+
|
|
|
+const dataVal = useVModel(props, 'jsData', emits)
|
|
|
+const modValue = useVModel(props, 'modelValue', emits)
|
|
|
+
|
|
|
+const jsEdit = ref(null)
|
|
|
+
|
|
|
+
|
|
|
+// 提示
|
|
|
+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 (['typescript', 'javascript'].includes(label)) {
|
|
|
+ return new tsWorker()
|
|
|
+ }
|
|
|
+ return new EditorWorker()
|
|
|
+ },
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(async () => {
|
|
|
+ await nextTick()
|
|
|
+ const monacoEditor = monaco.editor.create(jsEdit.value, {
|
|
|
+ // 初始化的dom节点
|
|
|
+ value: dataVal.value, // 初始化值
|
|
|
+ language: 'javascript', // 语言支持自行查阅demo
|
|
|
+ automaticLayout: true, // 自适应布局
|
|
|
+ theme: 'vs-dark', // 官方自带三种主题vs, hc-black, or vs-dark
|
|
|
+ foldingStrategy: 'indentation',
|
|
|
+ renderLineHighlight: 'all', // 行亮
|
|
|
+ selectOnLineNumbers: true, // 显示行号
|
|
|
+ minimap: {
|
|
|
+ enabled: false,
|
|
|
+ },
|
|
|
+ readOnly: false, // 只读
|
|
|
+ fontSize: 16, // 字体大小
|
|
|
+ scrollBeyondLastLine: false, // 取消代码后面一大段空白
|
|
|
+ overviewRulerBorder: true,
|
|
|
+ });
|
|
|
+
|
|
|
+ monacoEditor.onDidChangeModelContent((val) => {
|
|
|
+ dataVal.value = monacoEditor.getValue();
|
|
|
+ })
|
|
|
+
|
|
|
+ await nextTick()
|
|
|
+ await sleep(200)
|
|
|
+
|
|
|
+ monacoEditor.focus()
|
|
|
+
|
|
|
+})
|
|
|
+
|
|
|
+
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <el-dialog v-model="dialog" title="代码编辑" draggable @closed="modValue=false">
|
|
|
+ <div ref="jsEdit" style="width: 100%; height: 400px"></div>
|
|
|
+ </el-dialog>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style scoped lang="scss">
|
|
|
+
|
|
|
+</style>
|