Editor.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <template>
  2. <div ref="editorRef" style="width: 750px; height: 500px"></div>
  3. </template>
  4. <script lang="ts">
  5. import {
  6. ref,
  7. defineComponent,
  8. onMounted,
  9. PropType,
  10. onBeforeUnmount,
  11. } from "vue";
  12. import jsBeautify from "js-beautify";
  13. import * as monaco from "monaco-editor";
  14. //@ts-ignore
  15. import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
  16. //@ts-ignore
  17. import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
  18. //@ts-ignore
  19. import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker";
  20. //@ts-ignore
  21. import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker";
  22. //@ts-ignore
  23. import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker";
  24. const jsBeautifyOption = {
  25. indent_size: "2",
  26. indent_char: " ",
  27. max_preserve_newlines: "5",
  28. preserve_newlines: true,
  29. keep_array_indentation: false,
  30. break_chained_methods: false,
  31. indent_scripts: "normal",
  32. brace_style: "collapse",
  33. space_before_conditional: true,
  34. unescape_strings: false,
  35. jslint_happy: false,
  36. end_with_newline: true,
  37. wrap_line_length: "0",
  38. indent_inner_html: false,
  39. comma_first: false,
  40. e4x: false,
  41. indent_empty_lines: false,
  42. };
  43. export type Language = "javascript" | "json" | "html" | "typescript" | "sql";
  44. export default defineComponent({
  45. name: "DEditor",
  46. props: {
  47. code: {
  48. type: String,
  49. default: "",
  50. },
  51. language: {
  52. type: String as PropType<Language>,
  53. default: "javascript",
  54. },
  55. },
  56. emits: ["update:code", "change"],
  57. setup(props, { emit }) {
  58. const editorRef = ref();
  59. const modelValue = ref(jsBeautify(props.code, jsBeautifyOption));
  60. let editor: monaco.editor.IStandaloneCodeEditor;
  61. onMounted(() => {
  62. self.MonacoEnvironment = {
  63. getWorker(_, label) {
  64. if (label === "json") {
  65. return new jsonWorker();
  66. }
  67. if (label === "css" || label === "scss" || label === "less") {
  68. return new cssWorker();
  69. }
  70. if (label === "html" || label === "handlebars" || label === "razor") {
  71. return new htmlWorker();
  72. }
  73. if (label === "typescript" || label === "javascript") {
  74. return new tsWorker();
  75. }
  76. return new editorWorker();
  77. },
  78. };
  79. console.log(props.language)
  80. editor = monaco.editor.create(editorRef.value, {
  81. value: modelValue.value,
  82. language: props.language,
  83. theme: "vs-dark",
  84. });
  85. // 监听代码修改事件
  86. editor.onDidChangeModelContent(() => {
  87. const code = editor.getValue();
  88. emit('change', code);
  89. emit('update:code', code);
  90. });
  91. });
  92. onBeforeUnmount(() => {
  93. editor?.dispose();
  94. });
  95. return {
  96. editorRef,
  97. };
  98. },
  99. });
  100. </script>
  101. <style scoped></style>