vue3 monaco-editor 代码提示 提示重复问题

import * as monaco from 'monaco-editor'
import EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
import JsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'
import { ref,onMounted,toRaw, onUnmounted } from "vue"

const isChange = () => {
            monaco.languages.registerCompletionItemProvider('json', {
            provideCompletionItems: (model, position) => {
          // 获取当前行数
          const line = position.lineNumber;
          // 获取当前列数
          const column = position.column;
          // 获取当前输入行的所有内容
          const content = model.getLineContent(line)
          // 通过下标来获取当前光标后一个内容,即为刚输入的内容
          const sym = content[column - 2];
          const suggestions = ref(null);
          if (sym === "") {
             //拦截到用户输入$,开始设置提示内容,同else中代码一致,自行拓展
          } else {
            //直接提示,以下为sql语句关键词提示
            suggestions.value = [
                {
                    label: 'qqqqq',
                    kind: monaco.languages.CompletionItemKind.Function,
                    insertText: '""qqqqq":{\n\"type\":\"array\",\n\"items\":{}\n}"',
                    insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
                    detail: '返回指定参数的绝对值'
                }
            ]
          }
          return {
            suggestions: suggestions.value
          };
        },
        triggerCharacters: ['$', ''],
      });
        }

onMounted(() => {
            nextTick(initMonaco());
            isChange()
        })

出现的问题:

问题原因:registerCompletionItemProvider方法多次注册

解决方法1:将注册方法放置在组件之外(.ts文件)

import * as monaco from 'monaco-editor';
import { ref} from "vue"
/**
 * 注册:自定义语法补全
 */
export const registerProvider = () => {
  const monacoProvider = monaco.languages.registerCompletionItemProvider('json', {
    provideCompletionItems: () => {
        let suggestions = ref(null);
        suggestions.value = [
            {
                label: 'uploadFiles',
                kind: monaco.languages.CompletionItemKind.Function,
                insertText: '"uploadFiles":{"title": "上传文件","type": "string","ui:widget": "UploadWidget","ui:options":{"action": "/ab/api/v1/infrastructure/upload-file","btnText": "上传","style": {"width": "100%"}}}',
                insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
                detail: '返回指定参数的绝对值'
            }
        ]
      return {
        suggestions: suggestions.value,
      }
    },
  })
  return monacoProvider
}

引入使用:

import { registerProvider } from '@/utils/monacoEditor'
const registerPro = registerProvider();

onMounted(() => {
            nextTick(initMonaco());
            registerPro;
})

解决方法2:销毁时使用dispose()

本人没有尝试这个方法;有兴趣可以参考文档:https://github.com/microsoft/monaco-editor/issues?page=52&q=is%3Aissue+is%3Aclosed

onUnmounted(() => {
    registerPro.dispose()
})

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 中使用 Monaco Editor 实现 SQL 编辑器是一个常见的任务,因为 Monaco Editor 提供了强大的代码编辑和高亮功能,适合于多种编程语言,包括 SQL。以下是如何在 Vue3 中集成 Monaco Editor 的步骤: 1. **安装依赖**: 首先确保已经安装了 VueMonaco Editor。可以通过 npm 或者 yarn 安装: ```bash npm install vue@next monaco-editor # 或者 yarn add vue@next monaco-editor ``` 2. **引入并注册组件**: 在你的 Vue 组件中引入 MonacoEditor 组件,并将它注册为自定义组件: ```javascript import { createApp } from 'vue'; import MonacoEditor from 'monaco-editor.vue'; createApp(App).component('MonacoEditor', MonacoEditor); ``` 3. **配置组件**: 使用 `monaco.editor.create` 创建一个 Monaco 编辑器实例,并将 SQL 相关设置传递进去,如语言模式(`'sql'`)、初始代码等: ```html <template> <div> <MonacoEditor :value="sqlCode" :language="languageMode" :options="editorOptions" ></MonacoEditor> </div> </template> <script> export default { data() { return { sqlCode: '', // 初始的 SQL 代码 languageMode: 'sql', // SQL 语言模式 editorOptions: { lineNumbers: true, // 显示行号 wordWrap: 'on', // 自动换行 gutters: ['lineNumbers'], // 显示边距 }, }; }, // ... }; </script> ``` 4. **事件处理**: 如果需要监听编辑器的变化或保存操作,可以添加相应的事件处理器,如 `beforeModelChange` 和 `save`: ```javascript methods: { handleBeforeModelChange(editor, event) { // 在修改前做校验或记录操作 }, handleSave() { const sql = editor.getValue(); // 获取编辑器中的 SQL 代码 // 处理保存逻辑,例如提交到服务器 }, }, ``` 在 `<MonacoEditor>` 标签上绑定这些方法作为事件处理器。 5. **实时编辑和语法高亮**: Monaco Editor 自带了语法高亮,当设置的语言模式为 SQL 时,它会自动识别 SQL 语法并进行高亮。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值