old.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. cursorBlinkRate: {
  70. type: Number,
  71. required: false,
  72. default: -1,
  73. }
  74. })
  75. const editor = ref();
  76. let coder: any;
  77. nextTick(() => {
  78. coder = _CodeMirror.fromTextArea(editor.value, {
  79. mode: props.mode, // 不设置的话,默认使用第一个引用
  80. // 缩进格式
  81. tabSize: 2,
  82. // 显示行号
  83. autofocus: true,
  84. lineNumbers: true,
  85. lineWrapping: true,
  86. showCursorWhenSelecting: true,
  87. cursorBlinkRate: 530,
  88. theme: "ayu-mirage",
  89. matchTags: { bothTags: true },
  90. foldGutter: true,
  91. autoCloseTags: true,
  92. autoCloseBrackets: true,
  93. scrollbarStyle: "simple",
  94. extraKeys: {
  95. "Alt-F": "findPersistent",
  96. },
  97. readOnly: props.readOnly,
  98. gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter", "breakpoints"]
  99. });
  100. coder.setValue(props.content)
  101. coder.on('change', props.onchange)
  102. coder.setOption('cursorBlinkRate', props.cursorBlinkRate);
  103. });
  104. /**
  105. * 对外提供赋值
  106. */
  107. const setValue = (val: string) => {
  108. coder.setValue(val);
  109. };
  110. /**
  111. * 设置模式
  112. */
  113. const setMode = (mode: string) => {
  114. coder.setOption("mode", mode);
  115. }
  116. /**
  117. * 对外提供取值
  118. */
  119. const getValue = () => {
  120. return coder.getValue();
  121. };
  122. const setOption = (name: string, value: any) => {
  123. return coder.setOption(name, value)
  124. }
  125. defineExpose({
  126. setValue,
  127. getValue,
  128. setMode,
  129. setOption,
  130. })
  131. </script>