index.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <template>
  2. <div>
  3. <textarea ref="editor"></textarea>
  4. </div>
  5. </template>
  6. <script setup lang="ts">
  7. // 引入全局实例
  8. import _CodeMirror from "codemirror/lib/codemirror.js";
  9. // 核心样式
  10. import "codemirror/theme/oceanic-next.css";
  11. import "codemirror/theme/ayu-mirage.css";
  12. import "codemirror/theme/abcdef.css";
  13. import "codemirror/theme/abbott.css";
  14. import "codemirror/theme/3024-day.css";
  15. import "codemirror/theme/3024-night.css";
  16. import "codemirror/lib/codemirror.css";
  17. import "codemirror/theme/monokai.css";
  18. import "codemirror/theme/material-ocean.css";
  19. import "codemirror/addon/fold/foldgutter.css";
  20. import "codemirror/addon/display/fullscreen.css";
  21. import "codemirror/addon/dialog/dialog.css";
  22. import "codemirror/addon/search/matchesonscrollbar.css";
  23. import "codemirror/addon/scroll/simplescrollbars.css";
  24. import "codemirror/addon/fold/foldcode.js";
  25. import "codemirror/addon/edit/closetag.js";
  26. import "codemirror/addon/fold/foldgutter.js";
  27. import "codemirror/addon/fold/brace-fold.js";
  28. import "codemirror/addon/fold/xml-fold.js";
  29. import "codemirror/addon/fold/indent-fold.js";
  30. import "codemirror/addon/fold/comment-fold.js";
  31. import "codemirror/addon/edit/closebrackets.js";
  32. import "codemirror/addon/fold/xml-fold.js";
  33. import "codemirror/addon/edit/matchtags.js";
  34. import "codemirror/addon/display/fullscreen.js";
  35. import "codemirror/addon/dialog/dialog.js";
  36. import "codemirror/addon/search/searchcursor.js";
  37. import "codemirror/addon/search/search.js";
  38. import "codemirror/addon/scroll/annotatescrollbar.js";
  39. import "codemirror/addon/search/matchesonscrollbar.js";
  40. import "codemirror/addon/search/jump-to-line.js";
  41. import "codemirror/addon/scroll/simplescrollbars.js";
  42. import "codemirror/mode/htmlmixed/htmlmixed.js";
  43. import "codemirror/mode/javascript/javascript.js";
  44. import "codemirror/mode/xml/xml.js";
  45. import "codemirror/mode/css/css.js";
  46. import { ref, nextTick } from "vue";
  47. import "codemirror/mode/javascript/javascript.js";
  48. let props = defineProps({
  49. mode: {
  50. type: String,
  51. required: false,
  52. default: 'htmlmixed'
  53. },
  54. content: {
  55. type: String,
  56. required: false,
  57. default: ''
  58. },
  59. readOnly: {
  60. type: Boolean,
  61. required: false,
  62. default: false,
  63. },
  64. onchange: {
  65. type: Object as any,
  66. required: false,
  67. default: () => {},
  68. },
  69. })
  70. const editor = ref();
  71. let coder;
  72. nextTick(() => {
  73. coder = _CodeMirror.fromTextArea(editor.value, {
  74. mode: props.mode, // 不设置的话,默认使用第一个引用
  75. // 缩进格式
  76. tabSize: 2,
  77. // 显示行号
  78. lineNumbers: true,
  79. lineWrapping: true,
  80. theme: "ayu-mirage",
  81. matchTags: { bothTags: true },
  82. foldGutter: true,
  83. autoCloseTags: true,
  84. autoCloseBrackets: true,
  85. scrollbarStyle: "simple",
  86. extraKeys: {
  87. "Alt-F": "findPersistent",
  88. },
  89. readOnly: props.readOnly,
  90. gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter", "breakpoints"]
  91. });
  92. coder.setValue(props.content)
  93. coder.on('change', props.onchange)
  94. });
  95. /**
  96. * 对外提供赋值
  97. */
  98. const setValue = (val: string) => {
  99. coder.setValue(val);
  100. };
  101. /**
  102. * 设置模式
  103. */
  104. const setMode = (mode: string) => {
  105. coder.setOption("mode", mode);
  106. }
  107. /**
  108. * 对外提供取值
  109. */
  110. const getValue = () => {
  111. return coder.getValue();
  112. };
  113. const setOption = (name: string, value: any) => {
  114. return coder.setOption(name, value)
  115. }
  116. defineExpose({
  117. setValue,
  118. getValue,
  119. setMode,
  120. setOption,
  121. })
  122. </script>