vue3使用vue-codemirror输入sql高亮

安装vue-codemirror

npm install vue-codemirror --save

封装myCode组件

<template>
  <div class="codemirror-div">
<!--    SQL脚本语句-->
    <textarea v-model="sqlVal" label="SQL脚本语句" style="width:200px;" id="mycode" cols="30" rows="10"></textarea>
  </div>
</template>
<script>
import "codemirror/theme/ambiance.css";
import "codemirror/lib/codemirror.css";
import "codemirror/addon/hint/show-hint.css";
// let CodeMirror = require("codemirror/lib/codemirror");
import CodeMirror from "codemirror/lib/codemirror"
import "codemirror/addon/edit/matchbrackets"
import "codemirror/addon/selection/active-line"
// require("codemirror/mode/sql/sql");
import "codemirror/addon/hint/show-hint"
import "codemirror/addon/hint/sql-hint"
import 'codemirror/mode/sql/sql.js'
import {ref} from "vue";
export default {
  name: 'mycode',
  mounted(){
    this.initEditor()
  },
  setup(props,context) {
    // let value = ""
    const sqlVal = ref('')
    let editor = null;
    function initEditor(){
      editor = CodeMirror.fromTextArea(document.getElementById('mycode'), {
        mode: 'text/x-sql',//选择对应代码编辑器的语言,我这边选的是数据库,根据个人情况自行设置即可
        indentWithTabs: false, //在缩进时,是否需要把 n*tab宽度个空格替换成n个tab字符,默认为false
        smartIndent: true,//自动缩进,设置是否根据上下文自动缩进(和上一行相同的缩进量)。默认为true。
        lineNumbers: true,//是否在编辑器左侧显示行号。
        matchBrackets: true,// 匹配括号
        cursorHeight: 1, //光标高度。默认为1,也就是撑满行高。对一些字体,设置0.85看起来会更好。
        lineWrapping: true,// 自动换行
        // readOnly: this.readOnly, //是否只读
        //theme: theme,// 主题配置
        // autofocus: true,//是否在初始化时自动获取焦点。默认情况是关闭的。但是,在使用textarea并且没有明确指定值的时候会被自动设置为true。
        extraKeys: { 'Ctrl': 'autocomplete' },//自定义快捷键
        hintOptions: {//自定义提示选项
          // 当匹配只有一项的时候是否自动补全
          // completeSingle: false,
          tables: {
            users: ['name', 'score', 'birthDate'],
            countries: ['name', 'population', 'size']
          }
        }
      })
      let timeout
      editor.on('keyup', (cm, event) => {
        if (!cm.state.completeActive && ((event.keyCode >= 65 && event.keyCode <= 90) || event.keyCode == 52 || event.keyCode == 219 || event.keyCode == 190)) {
          CodeMirror.commands.autocomplete(cm, null, {
            completeSingle: false
          })
        }
        //加了一秒的防抖
        if (timeout) clearTimeout(timeout)
        timeout = setTimeout(() => {
          context.emit('changeTextarea', editor.getValue())
        }, 1000)
      })

    }
    // 清除值
    const clearVal=()=>{
      // console.log('清除',editor.getTextArea().value)
      editor.setValue('')
    }
    return {
      sqlVal,
      initEditor,
      clearVal
    }
  }
}
</script>

使用

<template>
  <div class="app-container" >
<!--    历史数据-->
    <el-row>
      <el-form :inline="true">
        <el-form-item>
<!--          <el-input v-model="sqlVal" type="textarea" style="width: 600px" clearable></el-input>-->
          <div style="border: 1px solid #b3b3b3;border-radius: 10px;width: 500px;overflow: hidden">
            <mycode ref="myCodeRef" @changeTextarea="changeTextarea" style="width: 500px;height: 200px"/>
          </div>
        </el-form-item>
        <el-form-item>
          <el-button type="info" plain size="large" @click="handleClear">清空</el-button>
          <el-button type="primary" size="large" @click="handleQuery" :icon="Search">查询</el-button>
        </el-form-item>
      </el-form>
    </el-row>
<!--    响应内容-->
    <el-table v-if="tableData.length>0" :data="tableData" :height="tableHeight">
      <el-table-column label="序号" align="center" width="120">
        <template #default="scope">
          <span>{{scope.$index+1}}</span>
        </template>
      </el-table-column>
      <el-table-column v-for="item in tableHeader" :prop="item" :label="item" align="center"></el-table-column>
    </el-table>
    <el-empty v-else description="暂无数据" />
  </div>
</template>
<script setup>
import {ref,onMounted,getCurrentInstance} from "vue";
import {getTaos} from "../../../api/system/history";
import { Search } from '@element-plus/icons-vue'
import Mycode from "./myCode";
const {proxy} = getCurrentInstance()
// 查询sql
const sqlVal = ref('')
// 表格数据
const tableData = ref([])
// 表头
const tableHeader = ref([])
const myCodeRef = ref()
// 表格高度
const tableHeight = ref()
const cmOptions=ref({
  mode: 'text/x-mariadb',
  indentWithTabs: true,
  smartIndent: true,
  lineNumbers: true,
  matchBrackets: true,
  styleActiveLine: true,
  cursorHeight:1, // 光标高度
  autoRefresh: true
})
onMounted(()=>{
  tableHeight.value = window.innerHeight-320
})

// 查询
const handleQuery = ()=>{
  // tableHeader.value = []
  let arr = []
  if(!sqlVal.value){
    proxy.$message({
      message: '请输入sql',
      type: 'warning',
      // duration: 2000,
      // showClose: true,
    })
    return
  }
  // console.log('gsgsg')
  getTaos(sqlVal.value).then(res=>{
    // console.log('rrr',res)
    if(res.code==200){
      tableData.value = res.data
      if(res.data){
        for(let key in res.data[0]){
          // console.log('ooo',key)
          arr.push(key)
          tableHeader.value=arr
        }
        // console.log('ooo',tableHeader.value)
      }
    }
  })
}
// 清空
const handleClear = ()=>{
  sqlVal.value = ''
  tableHeader.value=[]
  tableData.value=[]
  myCodeRef.value.clearVal()
  // console.log('lll',myCodeRef.value)
}
const changeTextarea = (val) => {
  // console.log(val)
  sqlVal.value = val
}
</script>
<style lang="less" scoped>
@import "src/assets/css/tableStyle";
</style>

效果

要在 Vue 3 项目中使用 `vue-codemirror` 实现 SQL 语法高亮,需要结合 CodeMirror 提供的 SQL 模式支持,并通过适当的配置来启用语法高亮功能。以下是实现步骤注意事项。 ### 安装依赖 首先,确保安装了必要的依赖包,包括 `vue-codemirror` SQL 模式支持: ```bash npm install vue-codemirror codemirror mode-sql ``` ### 引入并注册组件 在 Vue 3 项目的入口文件(如 `main.js` 或 `main.ts`)中引入 `vue-codemirror` 并注册为全局组件: ```javascript import { createApp } from &#39;vue&#39; import App from &#39;./App.vue&#39; import VueCodemirror from &#39;vue-codemirror&#39; import { sql } from &#39;@codemirror/lang-sql&#39; const app = createApp(App) app.use(VueCodemirror, { // 可以在这里设置默认扩展 extensions: [sql()] }) app.mount(&#39;#app&#39;) ``` ### 在组件中使用 CodeMirror 编辑器 在具体的 Vue 组件中使用 `<codemirror>` 标签,并为其提供初始值相关配置选项: ```vue <template> <div> <codemirror v-model="sqlCode" :extensions="extensions" :options="{ lineNumbers: true, theme: &#39;dracula&#39;, autocompletion: true, matchBrackets: true, styleActiveLineGutter: true }" /> </div> </template> <script setup> import { ref } from &#39;vue&#39; import { sql } from &#39;@codemirror/lang-sql&#39; const sqlCode = ref(&#39;SELECT * FROM &#39;) const extensions = [sql()] </script> ``` ### 配置说明 - **lineNumbers**: 启用行号显示。 - **theme**: 设置主题,例如 `&#39;dracula&#39;`,可以根据需求选择其他内置或自定义主题。 - **autocompletion**: 启用自动补全功能。 - **matchBrackets**: 启用括号匹配功能。 - **styleActiveLineGutter**: 选中行时突出显示行号区域。 ### 主题与样式 如果希望使用特定的主题(如 `&#39;ttcn&#39;` 或 `&#39;dracula&#39;`),还需要额外安装并导入对应的 CSS 文件: ```bash npm install codemirror-theme-ttcn codemirror-theme-dracula ``` 然后在组件中导入: ```javascript import { ttcn } from &#39;codemirror-theme-ttcn&#39; import { dracula } from &#39;codemirror-theme-dracula&#39; ``` 并在模板中指定主题名称: ```html <codemirror ... :options="{ theme: &#39;dracula&#39;, ... }" /> ``` ### 扩展功能 除了基本的 SQL 语法高亮外,还可以结合以下插件增强功能: - **代码折叠**:`@codemirror/lang-fold` - **语法检查**:`@codemirror/lint` - **自动补全**:`@codemirror/autocomplete` 这些功能可以进一步提升编辑器的交互体验实用性[^2]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值