开发者问题收集

我的 monaco 编辑器实例无法更新

2021-08-17
1728

问题:

我试图将 monaco-editor/react 集成到我的 Web 应用程序中并已成功加载它,但每当我在前端更改它时都会遇到错误。

一切都按预期工作,直到我以任何方式修改我的 editor 实例(即添加文本、调整大小等)。

我正在使用的 Web 应用程序 Grafana 在我与编辑器交互时都会出现此错误

我的错误:

error message

我的代码:

import Editor from '@monaco-editor/react';
...

interface MonacoEditorProps {
  value: string;
  theme: string;
  language: string;
  onChange: (value?: string | undefined) => void;
}
class MonacoEditor extends React.PureComponent<MonacoEditorProps> {
  getEditorValue: any | undefined;
  editorInstance: any | undefined;

  onSourceChange = () => {
    this.props.onChange(this.getEditorValue());
  };
  onEditorDidMount = (getEditorValue: any, editorInstance: any) => {
    this.getEditorValue = getEditorValue;
    this.editorInstance = editorInstance;
  };
  updateDimensions() {
    this.editorInstance.layout();
  }
  render() {
    const source = this.props.value;
    if (this.editorInstance) {
      this.editorInstance.layout();
    }
    return (
      <div onBlur={this.onSourceChange}>
        <Editor
          height={'33vh'}
          language={this.props.language}
          theme={this.props.theme}
          value={source}
          onMount={this.onEditorDidMount}
        />
      </div>
    );
  }
}

不要以为我偏离了 编辑器实例文档 太多。有人知道我是如何错误地更新编辑器的吗?

1个回答

我不知道为什么 onMount 仍然可用,但我已经使用 React 组件的常规 componentDidMount 方法进行布局,并使用 ref 作为实际编辑器实例。这非常有效:

private editorRef = React.createRef<Editor>();

...

                <Editor
                    ref={this.editorRef}
                    language={language}
                    options={opts}
                />

public componentDidMount(): void {
        this.editorRef.current?.editor?.layout();
        if (autofocus) {
            this.editorRef.current?.editor?.focus();
        }
    }
Mike Lischke
2021-08-18