在 react-split 中嵌入 react-ace

Posted

技术标签:

【中文标题】在 react-split 中嵌入 react-ace【英文标题】:Embedding react-ace in react-split 【发布时间】:2020-12-21 01:59:11 【问题描述】:

我在react-split 中嵌入了react-ace 的奇怪行为。这里我在两个窗格中嵌入了两个编辑器,并在第一个窗格的第一行输入了let x = "this line got scrolled left"

在键入代码时,只要我点击编辑器前面的黄色标题div 中文本的最右侧边距,Ace 就会在我键入时开始向左滚动该行。我可以随后将文本滚动回视图,但 Ace 不允许我将光标定位到编辑器中该点的右侧。

如果我从每个窗格中删除前面的黄色标题,Ace 的行为就好像这个滚动点是第一个字符,因此在我键入时永远不会让我看到这些字符。

就好像浏览器认为窗格有一个宽度,而 Ace 认为它有另一个宽度,该宽度是使用编辑器在窗格中显示其他任何内容所需的最小宽度。

这是我的 React,使用 nextjs 实现:

import Split from 'react-split'
import AceEditor from 'react-ace'
import 'brace/mode/javascript'

export default function Home() 
  return (
    <main className="outermost">
      <Split
        className="my_split"
        sizes=[50, 50]
        minSize=100
        expandToMin=false
        gutterSize=10
        gutterAlign="center"
        snapOffset=0
        direction="horizontal"
      >
        <CodePane id="left_pane" />
        <CodePane id="right_pane" />
      </Split>
    </main>
  )


function CodePane(props: id: string) 
  return <div id=props.id className="code_pane">
    <div className="pane_header">Right code margin |</div>
    <AceEditor
      name=props.id + "_editor"
      mode="javascript"
      
      
    />
  </div>;

这是我的 CSS:

body 
  padding: 0;
  margin: 0;


* 
  box-sizing: border-box;


.outermost 
  width: 100%;
  height: 100vh;
  background-color: darkblue;
  padding: 20px;


.my_split 
  display: flex;
  flex-direction: row;
  width: 100%;
  height: 100%;
  background-color: lightgray;


.pane_header 
  background-color: yellow;
  width: 100%;
  height: 20px;


.code_pane 
  height: 100%;
  background-color: red;


.split,
.gutter.gutter-horizontal 
  height: 100%;

我尝试实施 react-split docs 中的 CSS 建议。我也用float:left 实现了这个并且遇到了同样的问题。我可能搞错了,因为我发现文档很难理解。

我在 CSS 中做错了吗?感谢您提供的任何帮助。

(注意:我意识到 Ace 提供了一种拆分编辑器的方法,但这不是我想要在我的应用程序中做的事情。我只是使用两个编辑器进行演示。)

【问题讨论】:

【参考方案1】:

afk-mario 提供了an answer on GitHub,我会总结一下。

Ace 编辑器会重新计算其大小以响应窗口resize 事件,因此我可以通过手动发出此事件来强制重新计算。

将以下内容添加到 React 的 componentDidMount() 和 Split 的 onDragEnd() 处理程序可以解决问题:

window.dispatchEvent(new Event('resize'));

【讨论】:

以上是关于在 react-split 中嵌入 react-ace的主要内容,如果未能解决你的问题,请参考以下文章

从 ReactJS 外部渲染组件

Delphi 窗体中怎样嵌入网页

怎么在PDF文档中内嵌入字体

如何在Vue中嵌入React组件?如何在React中嵌入Vue组件?

嵌入式开发:C++在深度嵌入式系统中的应用

delphi中如何嵌入网页?