From 1cbecd2497d4fb2184295c6b92f6841144c91fa6 Mon Sep 17 00:00:00 2001 From: rhlin Date: Thu, 11 Jan 2024 14:41:45 +0800 Subject: [PATCH] [plugin-data] Fix state use jsfunction issue (#237) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(monaco-editor-completion): 隔离不同代码编辑器自动补全的注册,变量声明增加自动补全去掉js函数和state变量的自动补全提示 * feat(state): 状态管理使用JS表达式创建变量的时候提示不可使用其他变量以及JS函数 --- packages/common/component/LifeCycles.vue | 8 +++-- packages/common/js/completion.js | 14 +++++--- packages/plugins/data/src/CreateVariable.vue | 36 ++++++++++++++++++-- packages/plugins/script/src/Main.vue | 5 ++- packages/plugins/script/src/js/method.js | 3 +- 5 files changed, 55 insertions(+), 11 deletions(-) diff --git a/packages/common/component/LifeCycles.vue b/packages/common/component/LifeCycles.vue index 967efa02..7965f950 100644 --- a/packages/common/component/LifeCycles.vue +++ b/packages/common/component/LifeCycles.vue @@ -125,7 +125,8 @@ export default { bindLifeCycles: {}, editorValue: '{}', hasError: false, - linterWorker: null + linterWorker: null, + completionProvider: null }) watchEffect(() => { @@ -210,7 +211,7 @@ export default { return } // Lowcode API 提示 - initCompletion(editorRef.value.getMonaco()) + state.completionProvider = initCompletion(editorRef.value.getMonaco(), editorRef.value.getEditor()?.getModel()) // 初始化 ESLint worker state.linterWorker = initLinter(editor, editorRef.value.getMonaco(), state) @@ -226,6 +227,9 @@ export default { } onBeforeUnmount(() => { + state.completionProvider.forEach((provider) => { + provider.dispose() + }) // 终止 ESLint worker state.linterWorker?.terminate?.() }) diff --git a/packages/common/js/completion.js b/packages/common/js/completion.js index c51858ca..3705232a 100644 --- a/packages/common/js/completion.js +++ b/packages/common/js/completion.js @@ -157,7 +157,7 @@ const getWords = (model, position) => { const lastWord = model.getWordUntilPosition(lastPosition).word ? model.getWordUntilPosition(lastPosition) : getCurrentChar(model, lastPosition) - if (!/[\w\.]/.test(lastWord.word)) break + if (!/[\w.]/.test(lastWord.word)) break words.push(lastWord) lastPosition.column = lastWord.startColumn } @@ -172,9 +172,14 @@ const getRange = (position, words) => ({ endColumn: words[words.length - 1].endColumn }) -export const initCompletion = (monacoInstance) => { +export const initCompletion = (monacoInstance, editorModel, conditionFn) => { const completionItemProvider = { provideCompletionItems(model, position, _context, _token) { + if (editorModel && model.id !== editorModel.id) { + return { + suggestions: [] + } + } const words = getWords(model, position) const wordContent = words.map((item) => item.word).join('') const range = getRange(position, words) @@ -185,9 +190,10 @@ export const initCompletion = (monacoInstance) => { const snippetSuggestions = getSnippetsSuggestions(monacoInstance, range, wordContent) // 用户变量数据提示 e.g. this.dataSourceMap.xxx.load() const userSuggestions = getUserSuggestions(monacoInstance, range, wordContent) - return { - suggestions: [...apiSuggestions, ...snippetSuggestions, ...userSuggestions] + suggestions: [...apiSuggestions, ...snippetSuggestions, ...userSuggestions].filter((item) => + conditionFn ? conditionFn(item) : true + ) } }, triggerCharacters: ['.'] diff --git a/packages/plugins/data/src/CreateVariable.vue b/packages/plugins/data/src/CreateVariable.vue index c91597f4..b04b59cf 100644 --- a/packages/plugins/data/src/CreateVariable.vue +++ b/packages/plugins/data/src/CreateVariable.vue @@ -46,6 +46,11 @@
  • 示例2: function fnName() {}
  • 示例3: { getValue: () => {} }
  • +
    +
    + 注意:使用JS表达式定义state变量的时候无法调用state其他变量定义,
    另由于JS函数定义在变量之后,也无法调用JS面板定义的函数 +
    +