React CodeMirror 中文数据库表字段SQL自动补全源提示

SQL编辑器
CodeMirror 文档 https://uiwjs.github.io/react-codemirror/
结果展示

CodeMirror 版本
{
 "@codemirror/autocomplete": "^6.17.0",
 "@codemirror/lang-sql": "^6.6.4",
 "@uiw/react-codemirror": "^4.22.0"
}
完整代码
import { autocompletion, CompletionContext } from '@codemirror/autocomplete';
import { keywordCompletionSource, MySQL, sql } from '@codemirror/lang-sql';
import ReactCodeMirror from '@uiw/react-codemirror';
import { useState } from 'react';

export const CodeMirror: React.FC = () => {

  const [value, setValue] = useState('');

  const tableSchemas: any[] = [
    { label: '中文表名1', type: 'keyword' },
    { label: '中文表名2', type: 'keyword' },
    { label: 'report_account_daily', type: 'keyword' },
    { label: 'account_id', type: 'keyword', detail: '中文表名2' },
    { label: 'account_id', type: 'keyword', detail: 'report_account_daily' },
    { label: 'created_at', type: 'keyword', detail: '中文表名2' },
    { label: 'created_at', type: 'keyword', detail: 'report_account_daily' },
    { label: 'id', type: 'keyword', detail: '中文表名1' },
    { label: 'name', type: 'keyword', detail: '中文表名1' },
    { label: '奇葩', type: 'keyword', detail: '中文表名1' },
  ];

  const tableSchema: any = {
    中文表名1: ['id', 'name', '奇葩'],
    中文表名2: ['account_id', 'created_at'],
    report_account_daily: ['account_id', 'created_at'],
  };

  const myCompletions = (context: CompletionContext) => {
    const word: any = context.matchBefore(/[\w\u4e00-\u9fa5.]+/);
    if (!word || (word?.from === word.to && !context.explicit)) return null;
    let options = [];
    if (word) {
      const parts = word.text.split('.');
      if (parts.length === 1) {
        // 提供表名的自动补全
        options = tableSchemas.map((table) => ({
          ...table,
          type: 'keyword',
        }));
      } else if (parts.length === 2) {
        // 提供列名的自动补全
        const tableName = parts[0];
        if (tableSchema[tableName]) {
          options = tableSchema[tableName].map((col: any) => ({
            label: tableName + '.' + col,
            displayLabel: col,
            type: 'keyword',
          }));
        }
      }
    }

    return {
      from: word ? word.from : context.pos,
      to: context.pos,
      options: options,
    };
  };

  const combinedCompletions = (context: CompletionContext) => {
    // 调用内置 SQL 补全源
    const sqlCompletionSource = keywordCompletionSource(MySQL);
    // 获取 SQL 补全选项
    const sqlCompletions: any = sqlCompletionSource(context);
    const customCompletion: any = myCompletions(context);

    const options = [
      ...(sqlCompletions?.options || []),
      ...(customCompletion?.options || []),
    ];

    return {
      from: Math.min(
        sqlCompletions?.from ?? context.pos,
        customCompletion?.from ?? context.pos,
      ),
      to: Math.max(
        sqlCompletions?.to ?? context.pos,
        customCompletion?.to ?? context.pos,
      ),
      options,
    };
  };

  return (
    <>
      <ReactCodeMirror
        value={value}
        theme="light"
        height="700px"
        extensions={[
          sql({ dialect: MySQL }),
          autocompletion({ override: [combinedCompletions] }),
        ]}
        onChange={(val) => setValue(val)}
        onStatistics={(data) => {
          // 光标位置
          console.log(data.selectionAsSingle.to);
        }}
      />
    </>
  );
};

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React CodeMirror 是一个基于 ReactCodeMirror 组件。要实现代码提示,你可以使用 CodeMirror 的 `hint` 插件结合 React CodeMirror 组件来实现。 首先,安装必要的依赖: ```bash npm install codemirror react-codemirror2 ``` 然后,在你的代码中引入相关的模块: ```javascript import React, { useState } from 'react'; import { Controlled as CodeMirror } from 'react-codemirror2'; import 'codemirror/lib/codemirror.css'; import 'codemirror/theme/material.css'; import 'codemirror/mode/javascript/javascript.js'; import 'codemirror/addon/hint/show-hint.js'; import 'codemirror/addon/hint/show-hint.css'; import 'codemirror/addon/hint/javascript-hint.js'; ``` 接下来,创建一个包含 CodeMirror 组件的父组件,并设置相关的属性和状态: ```javascript const CodeMirrorComponent = () => { const [code, setCode] = useState(''); const handleCodeChange = (editor, data, value) => { setCode(value); }; return ( <CodeMirror value={code} options={{ mode: 'javascript', theme: 'material', lineNumbers: true, extraKeys: { 'Ctrl-Space': 'autocomplete' }, }} onBeforeChange={handleCodeChange} /> ); }; ``` 在这个例子中,我们使用了 `useState` 来保存用户输入的代码,并通过 `handleCodeChange` 函数来更新状态。CodeMirror 组件的属性中,我们设置了 `mode` 为 JavaScript,`theme` 为 Material Design 风格,`lineNumbers` 显示行号,`extraKeys` 用于绑定代码提示快捷键。 最后,在你的应用中使用 `CodeMirrorComponent` 组件: ```javascript const App = () => { return <CodeMirrorComponent />; }; ``` 这样,你就可以在 React 中使用 CodeMirror 组件并实现代码提示了。请注意,这里只演示了 JavaScript 的代码提示,如果你需要其他语言的代码提示,你需要导入相应的 CodeMirror 模式和插件,并相应地设置 `mode` 和 `extraKeys` 属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值