mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-06 20:03:05 +08:00
🐛 fix(QueryEditor): 修复多 Tab 导致 SQL 自动补全项重复的问题
- registerCompletionItemProvider 为 monaco.languages 全局 API,多 Tab 实例重复注册导致补全项成倍重复 - 添加模块级标志 sqlCompletionRegistered 确保全局只注册一次 - Provider 内部通过 ref 读取当前上下文,单次注册不影响多 Tab 的上下文感知 - refs #261
This commit is contained in:
@@ -170,6 +170,9 @@ const SQL_FUNCTIONS: { name: string; detail: string }[] = [
|
|||||||
{ name: 'SLEEP', detail: '工具 - 延时' },
|
{ name: 'SLEEP', detail: '工具 - 延时' },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// 模块级标志:确保 SQL completion provider 全局只注册一次
|
||||||
|
let sqlCompletionRegistered = false;
|
||||||
|
|
||||||
const QueryEditor: React.FC<{ tab: TabData }> = ({ tab }) => {
|
const QueryEditor: React.FC<{ tab: TabData }> = ({ tab }) => {
|
||||||
const [query, setQuery] = useState(tab.query || 'SELECT * FROM ');
|
const [query, setQuery] = useState(tab.query || 'SELECT * FROM ');
|
||||||
|
|
||||||
@@ -428,6 +431,9 @@ const QueryEditor: React.FC<{ tab: TabData }> = ({ tab }) => {
|
|||||||
// 应用透明主题(主题已在 main.tsx 全局注册)
|
// 应用透明主题(主题已在 main.tsx 全局注册)
|
||||||
monaco.editor.setTheme(darkMode ? 'transparent-dark' : 'transparent-light');
|
monaco.editor.setTheme(darkMode ? 'transparent-dark' : 'transparent-light');
|
||||||
|
|
||||||
|
// 全局只注册一次 SQL completion provider,避免多 tab 重复注册导致补全项重复
|
||||||
|
if (!sqlCompletionRegistered) {
|
||||||
|
sqlCompletionRegistered = true;
|
||||||
monaco.languages.registerCompletionItemProvider('sql', {
|
monaco.languages.registerCompletionItemProvider('sql', {
|
||||||
triggerCharacters: ['.'],
|
triggerCharacters: ['.'],
|
||||||
provideCompletionItems: async (model: any, position: any) => {
|
provideCompletionItems: async (model: any, position: any) => {
|
||||||
@@ -783,6 +789,7 @@ const QueryEditor: React.FC<{ tab: TabData }> = ({ tab }) => {
|
|||||||
return { suggestions };
|
return { suggestions };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} // end sqlCompletionRegistered guard
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleFormat = () => {
|
const handleFormat = () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user