当前位置:   article > 正文

需求 sql提示器和格式化,用vue-codemirror,sql-formatter,vue-highlightjs_vue3 sql-formatter

vue3 sql-formatter

前言

sql-formatter选择低版本,高版本会出错

sql-formatter格式化  vue-codemirror文本框  vue-highlightjs高亮

1.引入库

在vue2项目中引入一下依赖,需要注意vue-codemirror不能选取特别新版本,最新版本需要vue3支持

  1. npm install --save sql-formatter@2.3.3
  2. npm install --save vue-codemirror@4.0.1
  3. npm install --save vue-highlightjs  

2.子组件

创建SqlEditor.vue 里的代码如下:

  1. <template>
  2.     <div>
  3.         <textarea 
  4.             ref="mycode" 
  5.             class="codesql" 
  6.             v-model="value" 
  7.         >
  8.         </textarea>
  9.     </div>
  10. </template>
  11. <script>
  12.     import "codemirror/theme/ambiance.css";
  13.     import "codemirror/lib/codemirror.css";
  14.     import "codemirror/addon/hint/show-hint.css";
  15.     let CodeMirror = require("codemirror/lib/codemirror");
  16.     require("codemirror/addon/edit/matchbrackets");
  17.     require("codemirror/addon/selection/active-line");
  18.     require("codemirror/mode/sql/sql");
  19.     require("codemirror/addon/hint/show-hint");
  20.     require("codemirror/addon/hint/sql-hint");
  21.     export default {
  22.         data() {
  23.             return {
  24.                 editor: null
  25.             }
  26.         },
  27.         props: {
  28.             value: {
  29.                 type: String,
  30.                 default: ''
  31.             },
  32.             sqlStyle: {
  33.                 type: String,
  34.                 default: 'default'
  35.             },
  36.             readOnly: {
  37.                 type: [Boolean, String]
  38.             }
  39.         },
  40.         watch: {
  41.             newVal (newV, oldV) {
  42.                 if (this.editor) {
  43.                     this.$emit('changeTextarea', this.editor.getValue())
  44.                 }
  45.             }
  46.         },
  47.         computed: {
  48.             newVal () {
  49.                 if (this.editor) {
  50.                     return this.editor.getValue()
  51.                 } else {
  52.                     return ''
  53.                 }
  54.             }
  55.         },
  56.         
  57.         mounted(){
  58.             let mime = 'text/x-mariadb'
  59.             //let theme = 'ambiance'//设置主题,不设置的会使用默认主题
  60.             this.editor = CodeMirror.fromTextArea(this.$refs.mycode, {
  61.                 value: this.value,
  62.                 mode: mime,//选择对应代码编辑器的语言,我这边选的是数据库,根据个人情况自行设置即可
  63.                 indentWithTabs: true,
  64.                 smartIndent: true,
  65.                 lineNumbers: true,
  66.                 matchBrackets: true,
  67.                 cursorHeight: 1,
  68.                 lineWrapping: true,
  69.                 readOnly: this.readOnly,
  70.                 //theme: theme,
  71.                 // autofocus: true,
  72.                 extraKeys: {'Ctrl': 'autocomplete'},//自定义快捷键
  73.                 hintOptions: {//自定义提示选项
  74.                 // 当匹配只有一项的时候是否自动补全
  75.                     completeSingle: false,
  76.                     // tables: {
  77.                     //     users: ['name', 'score', 'birthDate'],
  78.                     //     countries: ['name', 'population', 'size']
  79.                     // }
  80.                 }
  81.             })
  82.             //代码自动提示功能,记住使用cursorActivity事件不要使用change事件,这是一个坑,那样页面直接会卡死
  83.             this.editor.on('inputRead', () => {
  84.                 this.editor.showHint()
  85.             })
  86.         },
  87.         methods: {
  88.             setVal () {
  89.                 if (this.editor) {
  90.                     if (this.value === '') {
  91.                         this.editor.setValue('')
  92.                     } else {
  93.                         this.editor.setValue(this.value)
  94.                     }
  95.                     
  96.                 }
  97.             }
  98.         }
  99.     }
  100. </script>
  101. <style>
  102. .CodeMirror {
  103.   color: black;
  104.   direction: ltr;
  105.   line-height: 22px;
  106. }
  107. .CodeMirror-hints{
  108.   z-index: 9999 !important;
  109. }
  110. </style>

3.父组件Text.vue引用

  1. <template>
  2. <div>
  3. <SqlEditor ref="sqleditor"
  4. :value="basicInfoForm.sqlMain"
  5. @changeTextarea="changeTextarea($event)"
  6. />
  7. <el-button type="primary" size="small" class="sql-btn" @click="formaterSql (basicInfoForm.sqlMain)">格式化sql</el-button>
  8. </div>
  9. </template>
  10. <script>
  11. import sqlFormatter from 'sql-formatter'
  12. import SqlEditor from './SqlEditor'
  13. export default {
  14. components: {
  15. SqlEditor
  16. },
  17. data() {
  18. return{
  19. basicInfoForm:{
  20. sqlMain: ''
  21. }
  22. }
  23. },
  24. methods:{
  25. changeTextarea (val){
  26. this.$set(this.basicInfoForm, 'sqlMain', val)
  27. },
  28. formaterSql (val) {
  29. let dom = this.$refs.sqleditor
  30. dom.editor.setValue(sqlFormatter.format(dom.editor.getValue()))
  31. },
  32. },
  33. }
  34. </script>

总结

 

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