当前位置:   article > 正文

vue-codemirror实现sql和json线上编辑器_在线sql编辑器

在线sql编辑器

实习小计01

今天老大让写一个线上编辑器,写的是sql和json两个编译器,sql的编译器要有提示,

老大扔过来两个选择,1:vue-codemirror;2:monaco-editor,一个前端小白,只会vue,所以果断选那个我有点沾边的(也就是vue-codemirror),到网上查了一下文档,照着文档大致做出来的,这里主要参考的文章有:http://t.csdn.cn/BTlnvhttp://t.csdn.cn/8Gl0F其中第一篇文章是sql的,第二篇文章是json的,因为公司做的是基于vue2的项目,然后在网上看到vue-codemirror的v6和v7好像只能支持vue3,所以就装了vue-codemirror@4.0.6

具体步骤:

1.首先看自己的项目用的是vue2还是vue3,如果是vue3可以直接安装

npm install vue-codemirror --save

        如果是vue2的项目就要指定版本安装,

npm install vue-codemirror@4.0.6 --save

        当然你也可以指定其他版本;

2.安装完成后就是引入,在main.js的文件内引入

  1. import VueCodemirror from 'vue-codemirror'
  2. import 'codemirror/lib/codemirror.css'
  3. Vue.use(VueCodemirror)

 3.引入成功之后就可以开始使用了,直接新建个vue文件,把下面的粘贴进去就好,这样SQL编译器就成了

  1. <template>
  2. <textarea ref="mycode" class="codesql" v-model="code" style="height:200px;width:600px;"></textarea>
  3. </template>
  4. <script>
  5. import 'codemirror/theme/ambiance.css'
  6. import 'codemirror/lib/codemirror.css'
  7. import 'codemirror/addon/hint/show-hint.css'
  8. const CodeMirror = require('codemirror/lib/codemirror')
  9. require('codemirror/addon/edit/matchbrackets')
  10. require('codemirror/addon/selection/active-line')
  11. require('codemirror/mode/sql/sql')
  12. require('codemirror/addon/hint/show-hint')
  13. require('codemirror/addon/hint/sql-hint')
  14. export default {
  15. name: 'CodeMirror',
  16. data () {
  17. return {
  18. code: '//sql语法编译器'
  19. }
  20. },
  21. mounted () {
  22. // debugger
  23. const mime = 'text/x-mariadb'
  24. // let theme = 'ambiance'//设置主题,不设置的会使用默认主题
  25. const editor = CodeMirror.fromTextArea(this.$refs.mycode, {
  26. mode: mime, // 选择对应代码编辑器的语言,我这边选的是数据库,根据个人情况自行设置即可
  27. indentWithTabs: true,
  28. smartIndent: true,
  29. lineNumbers: true,
  30. matchBrackets: true,
  31. // theme: theme,
  32. // autofocus: true,
  33. extraKeys: { 'Ctrl': 'autocomplete' }, // 自定义快捷键
  34. hintOptions: { // 自定义提示选项
  35. tables: {
  36. users: ['name', 'score', 'birthDate'],
  37. countries: ['name', 'population', 'size']
  38. }
  39. }
  40. })
  41. // 代码自动提示功能,记住使用cursorActivity事件不要使用change事件,这是一个坑,那样页面直接会卡死
  42. editor.on('cursorActivity', function () {
  43. editor.showHint()
  44. })
  45. // 挂载监听事件拿到输入的内容
  46. editor.on('change', (cm) => {
  47. console.log(cm.getValue())
  48. })
  49. }
  50. }
  51. </script>
  52. <style lang="less">
  53. .codesql {
  54. font-size: 11pt;
  55. font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
  56. }
  57. .CodeMirror-hints {
  58. z-index: 99999;
  59. }
  60. </style>

4.如果想做的是json编译器可以把第三步要黏贴的代码换成下面这段

  1. <template>
  2. <div class="json-editor">
  3. <textarea ref="textarea"/>
  4. </div>
  5. </template>
  6. <script>
  7. import CodeMirror from 'codemirror'
  8. import 'codemirror/addon/lint/lint.css'
  9. import 'codemirror/lib/codemirror.css'
  10. import 'codemirror/theme/panda-syntax.css'
  11. import 'codemirror/mode/javascript/javascript'
  12. import 'codemirror/addon/lint/json-lint'
  13. // 折叠代码
  14. import 'codemirror/addon/fold/foldgutter.css'
  15. import 'codemirror/addon/fold/foldcode.js'
  16. import 'codemirror/addon/fold/foldgutter.js'
  17. import 'codemirror/addon/fold/brace-fold.js'
  18. import 'codemirror/addon/fold/xml-fold.js'
  19. import 'codemirror/addon/fold/indent-fold.js'
  20. import 'codemirror/addon/fold/markdown-fold.js'
  21. import 'codemirror/addon/fold/comment-fold.js'
  22. export default {
  23. name: 'JsonEditor',
  24. // eslint-disable-next-line vue/require-prop-types
  25. props: ['value'],
  26. data () {
  27. return {
  28. jsonEditor: false
  29. }
  30. },
  31. watch: {
  32. value (value) {
  33. const editorValue = this.jsonEditor.getValue()
  34. if (value !== editorValue) {
  35. this.jsonEditor.setValue(JSON.stringify(this.value, null, 2))
  36. }
  37. }
  38. },
  39. mounted () {
  40. this.jsonEditor = CodeMirror.fromTextArea(this.$refs.textarea, {
  41. lineNumbers: true,
  42. mode: 'application/json',
  43. gutters: ['CodeMirror-lint-markers', 'CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
  44. theme: 'panda-syntax',
  45. lint: true,
  46. foldGutter: {
  47. // eslint-disable-next-line new-cap
  48. rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.indent, CodeMirror.fold.comment)
  49. }
  50. })
  51. // 下面这行不知道是干什么的,正常来说是不注释掉的,但会报错
  52. // this.jsonEditor.setValue(JSON.stringify(this.value, null, 2))
  53. this.jsonEditor.on('change', cm => {
  54. this.$emit('changed', cm.getValue())
  55. this.$emit('input', cm.getValue())
  56. //拿到你输入的值
  57. console.log(cm.getValue())
  58. })
  59. },
  60. methods: {
  61. getValue () {
  62. return this.jsonEditor.getValue()
  63. }
  64. }
  65. }
  66. </script>
  67. <style scoped>
  68. .json-editor {
  69. height: 100%;
  70. position: relative;
  71. }
  72. .json-editor >>> .CodeMirror {
  73. height: auto;
  74. min-height: 180px;
  75. }
  76. .json-editor >>> .CodeMirror-scroll {
  77. min-height: 180px;
  78. }
  79. .json-editor >>> .cm-s-rubyblue span.cm-string {
  80. color: #f08047;
  81. }
  82. </style>

 5.最后要注意看代码中的注释,因为每个人的项目都不一样,黏贴进去很有可能报错,所以一定要仔细排查,尤其是mounted的生命周期里,我在那里就报了个错,很是头疼,最后把那一行注释掉就好了,虽然不知道那一行是干啥的( ̄▽ ̄)"

6.实现效果:(我们这个是需求在弹窗里弹出来这个编译器,sql有提示,json没有提示)

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/710209
推荐阅读
相关标签
  

闽ICP备14008679号