当前位置:首页 > 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 主题的配置方式:

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

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

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

vue实现codemirror sql

标签: vuecodemirror
分享给朋友:

相关文章

vue实现tablegrid

vue实现tablegrid

Vue 实现 TableGrid 的方法 使用 Element UI 的 Table 组件 Element UI 提供了强大的 Table 组件,可以快速实现表格布局。安装 Element UI 后,…

vue实现水印

vue实现水印

Vue 实现水印的方法 使用 CSS 背景图 通过 CSS 的 background-image 和 background-repeat 属性实现水印效果。创建一个包含水印文本的 Canvas,将其转…

vue实现Siri

vue实现Siri

Vue 实现 Siri 风格语音交互 实现类似 Siri 的语音交互功能需要结合语音识别、语音合成和前端交互逻辑。Vue 作为前端框架,可以很好地管理这些功能的交互状态。 语音识别集成 使用 We…

vue实现拖动

vue实现拖动

Vue实现拖动的常用方法 在Vue中实现拖动功能通常需要结合HTML5的拖放API或第三方库。以下是几种常见实现方式: 使用HTML5原生拖放API HTML5提供了原生拖放API,可以通过dra…

vue实现 单选

vue实现 单选

实现 Vue 单选功能 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 可以轻松实现单选功能,将单选按钮的值绑定到…

vue实现slidetoggle

vue实现slidetoggle

Vue 实现 SlideToggle 效果 SlideToggle 是一种常见的交互效果,元素以滑动方式展开或收起。以下是几种实现方法: 使用 CSS Transition 和 v-show…