使 ReactDOM.createPortal 插入元素作为目标容器的第一个子元素(而不是最后一个子元素)

jef*_*ese 6 javascript dom reactjs

所以我使用ReactDOM.createPortal在它的正常 DOM 放置之外渲染一个元素。我必须这样做,因为我正在与创建它自己的元素(在我的范围之外)的库进行交互,并且我必须将我的一个 DOM 元素放在他们的元素中。

我正在使用的createPortal是:

<div class="target">
    <div />
    <div class="myDiv" />
</div>
Run Code Online (Sandbox Code Playgroud)

我正在努力实现的目标:

<div class="target">
    <div class="myDiv" />
    <div/>
</div>
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到如何更改createPortal使其将节点作为第一个子节点插入的行为。

Est*_*ask 5

React 将用于appendChild渲染门户,这种行为是内在的,不会改变。

如果一个门户应该在其他孩子之前显示,那么应该在现有的 DOM 中提供一个容器:

<div class="target">
    <div class="portal-container">...rendered portal...</div>
    <div />
</div>
Run Code Online (Sandbox Code Playgroud)

如果这是不可能的,则应直接访问 DOM 以编程方式添加容器,类似于本指南示例

class PrependedPortal extends React.Component {
  portalRoot = document.querySelector('.target');
  portalContainer = document.createElement('div');

  componentDidMount() {
    this.portalRoot.prepend(this.portalContainer);
  }

  componentWillUnmount() {
    this.portalRoot.removeChild(this.portalContainer);
  }

  render() {
    return ReactDOM.createPortal(
      this.props.children,
      this.portalContainer
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

prepend没有得到很好的支持,需要填充或替换为类似的 DOM 操作,例如 jQuery prepend