react18+vite4 封装SQL编辑器

安装 react-aceace-builds

npm install react-ace ace-builds --save
# 或
yarn add react-ace ace-builds
import { useState, useEffect, useRef } from 'react';
import AceEditor, { IAceEditorProps } from 'react-ace';
import 'ace-builds/src-noconflict/mode-sql';
import 'ace-builds/src-min-noconflict/theme-github';

interface CustomAceEditorProps extends IAceEditorProps {
  onSave?: (value: string) => void;
  value?: string;
}

function CustomAceEditor(props: CustomAceEditorProps) {
  const [value, setValue] = useState<string>(props.value ?? '');
  const editorRef = useRef<AceEditor>(null);

  useEffect(() => {
    if (editorRef.current) {
      const editor = editorRef.current.editor;

      // 设置options
      editor.setOptions({
        enableBasicAutocompletion: true,
        enableLiveAutocompletion: true,
        highlightActiveLine: true,
        showPrintMargin:true,
        printMarginColumn: 80,
        theme: 'github',
        readOnly: props.readOnly ? true : false,
        mode: 'sql'
      });

      // 初始化值
      if (props.value) {
        editor.setValue(value);
      }

      // 绑定 change 回调
      editor.on('change', () => {
        setValue(editor.getValue());
      });
    }
  }, [props]);

  function saveHandler() {
    props.onSave?.(value);
  }

  return (
    <div>
      <AceEditor ref={editorRef} {...props} />
      {props.onSave && <button onClick={saveHandler}>保存</button>}
    </div>
  );
}

export default CustomAceEditor;

组件使用

import { useState } from 'react';
import CustomAceEditor from './CustomAceEditor';

function App() {
  const [sql, setSql] = useState('');

  function saveHandler(value: string) {
    setSql(value);
  }

  return (
    <div>
      <h1>React Ace Editor</h1>
      <CustomAceEditor
        value={sql}
        width="100%"
        height="400px"
        onSave={saveHandler}
      />
    </div>
  );
}

export default App;

vite.config.js配置

import reactRefresh from "@vitejs/plugin-react-refresh";
import path from "path";

export default {
  plugins: [reactRefresh()],
  resolve: {
    alias: {
      // 修改 ace 的路径别名
      ace: path.resolve(__dirname, "node_modules/ace-builds/src-noconflict"),
    },
  },
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值