JsEditDialog.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <script setup lang="ts">
  2. import {defineProps, nextTick, onMounted, ref} from "vue";
  3. import {useVModel} from "@vueuse/core";
  4. import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'
  5. import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'
  6. import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'
  7. import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'
  8. import EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
  9. import * as monaco from 'monaco-editor';
  10. import sleep from "../../../utils/sleep";
  11. import {componentType} from "../../../components/query-components/page-help-type";
  12. const props = defineProps<{
  13. submitEvent: string,
  14. modelValue: boolean,
  15. pageJson: componentType
  16. }>()
  17. const dialog = ref(true)
  18. const emits = defineEmits(['update:modelValue', 'update:submitEvent'])
  19. const submitEventVal = useVModel(props, 'submitEvent', emits)
  20. const modValue = useVModel(props, 'modelValue', emits)
  21. const jsEdit = ref(null)
  22. // 提示
  23. self.MonacoEnvironment = {
  24. getWorker(_: string, label: string) {
  25. if (label === 'json') {
  26. return new jsonWorker()
  27. }
  28. if (label === 'css' || label === 'scss' || label === 'less') {
  29. return new cssWorker()
  30. }
  31. if (label === 'html' || label === 'handlebars' || label === 'razor') {
  32. return new htmlWorker()
  33. }
  34. if (['typescript', 'javascript'].includes(label)) {
  35. return new tsWorker()
  36. }
  37. return new EditorWorker()
  38. },
  39. }
  40. let queryType, configType;
  41. const setQueryType = () => {
  42. let tempStr = `let queryData = ${JSON.stringify(props.pageJson.queryParam)} `
  43. queryType = monaco.languages.typescript.javascriptDefaults.addExtraLib(tempStr, 'queryData');
  44. }
  45. const setConfigType = () => {
  46. configType = monaco
  47. .languages
  48. .typescript
  49. .javascriptDefaults
  50. .addExtraLib(`let config = ${JSON.stringify(props.pageJson)}`);
  51. }
  52. const closed = () => {
  53. // 销毁类型下一个人要用
  54. queryType.dispose()
  55. configType.dispose()
  56. modValue.value = false
  57. }
  58. onMounted(async () => {
  59. await nextTick()
  60. const monacoEditor = monaco.editor.create(jsEdit.value, {
  61. // 初始化的dom节点
  62. value: submitEventVal.value, // 初始化值
  63. language: 'javascript', // 语言支持自行查阅demo
  64. automaticLayout: true, // 自适应布局
  65. theme: 'vs-dark', // 官方自带三种主题vs, hc-black, or vs-dark
  66. foldingStrategy: 'indentation',
  67. renderLineHighlight: 'all', // 行亮
  68. selectOnLineNumbers: true, // 显示行号
  69. minimap: {
  70. enabled: false,
  71. },
  72. readOnly: false, // 只读
  73. fontSize: 16, // 字体大小
  74. scrollBeyondLastLine: false, // 取消代码后面一大段空白
  75. overviewRulerBorder: true,
  76. });
  77. monacoEditor.onDidChangeModelContent((val) => {
  78. submitEventVal.value = monacoEditor.getValue();
  79. })
  80. await nextTick()
  81. await sleep(200)
  82. monacoEditor.focus()
  83. setQueryType()
  84. setConfigType()
  85. })
  86. </script>
  87. <template>
  88. <el-dialog v-model="dialog" title="代码编辑" draggable @closed="closed">
  89. <div ref="jsEdit" style="width: 100%; height: 400px"></div>
  90. </el-dialog>
  91. </template>
  92. <style scoped lang="scss">
  93. </style>