摩纳哥编辑器 deltaDecorations 更改整个文本的样式,而不仅仅是给定范围

Monaco editor deltaDecorations changes the style of the whole text instead of just the given range

我正在使用带有 React. I want to change the background color of a specific range in a line. I am following this tutorial 的 Monaco 编辑器,它来自官方文档。

代码如下所示。

const editorDidMount = (editor, monaco) => {
    const r = new monaco.Range(1, 3, 1, 10);
    editor.deltaDecorations(
        [],
        [
            {
                range: r,
                options: {
                    inlineClassName: "myInlineDecoration",
                },
            },
        ]
    );
};

这就是我创建编辑器元素的方式。没什么特别的。

<MonacoEditor
    width={800}
    height={400}
    language="java"
    value={value}
    onChange={onValueChange}
    editorDidMount={editorDidMount}
/>

和css

.myInlineDecoration {
    background: lightgreen;
}

问题在于,这会将整个文本的背景颜色更改为 lightgreen,而不仅仅是给定的范围。

看起来像这样。但我只想要一个特定的范围,而不是所有的。

我尝试了 here 中的不同选项,但其中 none 有任何不同。

如果需要更多信息,请告诉我。

正如您在评论中提到的,问题似乎是该值开始时为空白,然后选择在更改时自动扩展为整个文本。

如果您想在文本更改时保留装饰,您可以将 monaco 对象存储在 ref 中,并在每次值更改时执行的 useEffect 挂钩中使用它们。

...
  const monacoObjects = useRef(null);

  const editorDidMount = (editor, monaco) => {
    monacoObjects.current = {
      editor,
      monaco,
    };
  };

  useEffect(() => {
    if (!monacoObjects.current) return;
    const { monaco, editor } = monacoObjects.current;
    const r = new monaco.Range(1, 3, 1, 10);
    editor.deltaDecorations(
      [],
      [
        {
          range: r,
          options: {
            inlineClassName: "myInlineDecoration",
          },
        },
      ]
    );
  }, [value]);

  return (
    <MonacoEditor
      width={800}
      height={400}
      language="java"
      value={value}
      onChange={onValueChange}
      editorDidMount={editorDidMount}
    />
  );
...