当前位置:首页 > VUE

vue实现codemirror sql

2026-02-17 22:28:56VUE

Vue 中集成 CodeMirror 实现 SQL 编辑器

安装依赖 需要安装 codemirror 核心库及 SQL 模式插件:

npm install codemirror @codemirror/lang-sql

基础组件实现 创建 Vue 组件文件(如 SqlEditor.vue):

<template>
  <div ref="editorContainer"></div>
</template>

<script>
import { ref, onMounted, onBeforeUnmount } from 'vue'
import { EditorView, basicSetup } from 'codemirror'
import { sql } from '@codemirror/lang-sql'

export default {
  setup() {
    const editorContainer = ref(null)
    let editorView = null

    onMounted(() => {
      editorView = new EditorView({
        doc: 'SELECT * FROM table',
        extensions: [
          basicSetup,
          sql(),
          EditorView.updateListener.of(update => {
            if (update.docChanged) {
              console.log(update.state.doc.toString())
            }
          })
        ],
        parent: editorContainer.value
      })
    })

    onBeforeUnmount(() => {
      editorView?.destroy()
    })

    return { editorContainer }
  }
}
</script>

自定义 SQL 语法高亮

通过扩展语法配置实现更精细的 SQL 高亮:

import { sql, MySQL } from '@codemirror/lang-sql'

const extensions = [
  basicSetup,
  sql({
    dialect: MySQL,
    upperCaseKeywords: true
  }),
  EditorView.theme({
    '&': { height: '300px' },
    '.cm-scroller': { fontFamily: 'monospace' }
  })
]

添加自动补全功能

集成 SQL 自动补全需要自定义补全源:

import { autocompletion } from '@codemirror/autocomplete'

const sqlCompletion = sql().language.data.of({
  autocomplete: context => {
    const keywords = ['SELECT', 'FROM', 'WHERE', 'INSERT', 'UPDATE']
    const match = context.matchBefore(/\w*/)
    if (!match) return null

    return {
      from: match.from,
      options: keywords.map(word => ({
        label: word,
        type: "keyword"
      }))
    }
  }
})

// 在 extensions 中添加
extensions.push(autocompletion({ override: [sqlCompletion] }))

处理编辑器值变化

双向绑定实现方案:

const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])

// 在 EditorView 配置中添加
extensions.push(
  EditorView.updateListener.of(update => {
    if (update.docChanged) {
      emit('update:modelValue', update.state.doc.toString())
    }
  })
)

// 初始化时设置初始值
editorView = new EditorView({
  doc: props.modelValue || '',
  // ...其他配置
})

响应式布局处理

添加窗口大小变化的响应式处理:

import { debounce } from 'lodash-es'

onMounted(() => {
  const handleResize = debounce(() => {
    editorView?.requestMeasure()
  }, 200)

  window.addEventListener('resize', handleResize)
  onBeforeUnmount(() => window.removeEventListener('resize', handleResize))
})

主题定制示例

使用 Material 主题的配置方式:

vue实现codemirror sql

import { oneDark } from '@codemirror/theme-one-dark'

extensions.push(
  oneDark,
  EditorView.theme({
    '.cm-activeLine': { backgroundColor: '#37414b' },
    '.cm-gutters': { backgroundColor: '#282c34' }
  })
)

以上实现方案提供了从基础集成到高级定制的完整路径,可根据实际需求选择功能模块组合使用。注意在组件销毁时调用 editorView.destroy() 防止内存泄漏。

标签: vuecodemirror
分享给朋友:

相关文章

vue实现活动倒计时

vue实现活动倒计时

实现活动倒计时的基本思路 在Vue中实现活动倒计时通常需要获取当前时间与活动结束时间的差值,并将其转换为天、小时、分钟、秒的格式展示。通过定时器每秒更新显示的时间。 定义倒计时数据 在Vue组件的d…

vue实现复选

vue实现复选

Vue 实现复选框 在 Vue 中实现复选框可以通过 v-model 指令绑定数据,同时结合 input 元素的 type="checkbox" 属性来实现。以下是几种常见的实现方式: 单个复选框…

vue实现博客

vue实现博客

Vue 实现博客的基本步骤 使用 Vue.js 实现一个博客系统可以分为前端和后端两部分。以下是基于 Vue 的前端实现方案,后端可以选择 Node.js、Django 或其他框架。 项目初始化 使…

vue 实现树状

vue 实现树状

Vue 实现树状结构的方法 递归组件实现树状结构 递归组件是 Vue 中实现树状结构的常见方法。通过组件自身调用自身,可以轻松构建多层级树状结构。 <template> <ul…

实现vue datepicker

实现vue datepicker

安装依赖 使用 vue-datepicker 或第三方库如 v-calendar 或 vue2-datepicker。以 vue2-datepicker 为例: npm install vue2…

vue 动画实现

vue 动画实现

Vue 动画实现方式 Vue 提供了多种方式实现动画效果,主要分为内置组件和第三方库集成。 使用 Vue 内置过渡组件 Vue 的 <transition> 和 <transiti…