index.vue 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <template>
  2. <div>
  3. <textarea ref="textarea">
  4. 白日依山尽,黄河入海流。
  5. 欲穷千里目,更上一层楼。
  6. </textarea
  7. >
  8. </div>
  9. </template>
  10. <script lang="ts">
  11. import { defineComponent, onMounted, ref, reactive } from 'vue';
  12. // 引入全局实例
  13. import _CodeMirror from 'codemirror';
  14. // 核心样式
  15. import 'codemirror/lib/codemirror.css';
  16. // 引入主题后还需要在 options 中指定主题才会生效
  17. import 'codemirror/theme/cobalt.css';
  18. // 需要引入具体的语法高亮库才会有对应的语法高亮效果
  19. // codemirror 官方其实支持通过 /addon/mode/loadmode.js 和 /mode/meta.js 来实现动态加载对应语法高亮库
  20. // 但 vue 貌似没有无法在实例初始化后再动态加载对应 JS ,所以此处才把对应的 JS 提前引入
  21. import 'codemirror/mode/javascript/javascript.js';
  22. import 'codemirror/mode/css/css.js';
  23. import 'codemirror/mode/xml/xml.js';
  24. import 'codemirror/mode/clike/clike.js';
  25. import 'codemirror/mode/markdown/markdown.js';
  26. import 'codemirror/mode/python/python.js';
  27. import 'codemirror/mode/r/r.js';
  28. import 'codemirror/mode/shell/shell.js';
  29. import 'codemirror/mode/sql/sql.js';
  30. import 'codemirror/mode/swift/swift.js';
  31. import 'codemirror/mode/vue/vue.js';
  32. // 尝试获取全局实例
  33. export default defineComponent({
  34. components: {},
  35. setup() {
  36. const CodeMirror = window.CodeMirror || _CodeMirror;
  37. const textarea = ref(null);
  38. const options = reactive({
  39. // 缩进格式
  40. tabSize: 2,
  41. // 主题,对应主题库 JS 需要提前引入
  42. theme: 'cobalt',
  43. // 显示行号
  44. lineNumbers: true,
  45. line: true,
  46. });
  47. onMounted(() => {
  48. init();
  49. });
  50. function init() {
  51. CodeMirror.fromTextArea(textarea.value, options);
  52. }
  53. return {
  54. textarea,
  55. };
  56. },
  57. });
  58. </script>
  59. <style lang="css" scoped></style>