import MonacoEditor from 'react-monaco-editor'; import { connect, mapProps } from '@formily/react'; import { useCallback, useEffect, useRef, useState } from 'react'; import type { MonacoEditorProps } from 'react-monaco-editor/lib/types'; interface Props extends MonacoEditorProps {} export const JMonacoEditor = (props: Props) => { const [loading, setLoading] = useState(false); const formatLock = useRef(false); const monacoRef = useRef(); const monacoEditorRef = useRef(); const editorFormat = (editor: any) => { editor.getAction('editor.action.formatDocument').run(); }; useEffect(() => { if (formatLock.current === false && monacoEditorRef.current) { setTimeout(() => { editorFormat(monacoEditorRef.current); }, 300); formatLock.current = true; } }, [props.value, loading, monacoEditorRef.current]); const editorDidMountHandle = useCallback((editor: any, monaco: any) => { monacoEditorRef.current = editor; props.editorDidMount?.(editor, monaco); }, []); return (
{ setTimeout(() => { setLoading(true); }, 100); }} style={{ height: '100%', width: '100%' }} > {loading && ( { monacoRef.current = r; if (r && formatLock.current === false) { editorFormat(r.editor); } }} {...props} options={{ wordWrap: 'on', automaticLayout: true }} editorDidMount={editorDidMountHandle} /> )}
); }; const FMonacoEditor = connect(JMonacoEditor, mapProps()); export default FMonacoEditor;