【问题标题】:Make ReactDOM.createPortal insert element as first child of target container (instead of last child)将 ReactDOM.createPortal 插入元素作为目标容器的第一个子元素(而不是最后一个子元素)
【发布时间】:2019-03-10 13:16:33
【问题描述】:

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

我使用createPortal 得到的是:

<div class="target">
    <div />
    <div class="myDiv" />
</div>

我想要达到的目标:

<div class="target">
    <div class="myDiv" />
    <div/>
</div>

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

【问题讨论】:

  • 您使用的相关代码会很有帮助

标签: javascript reactjs dom


【解决方案1】:

React 将使用appendChild 来呈现一个门户,这种行为是固有的,不会改变。

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

<div class="target">
    <div class="portal-container">...rendered portal...</div>
    <div />
</div>

如果这不可行,则应直接访问 DOM 以编程方式添加容器,类似于 this guide example

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
    );
  }
}

prepend isn't well-supported and needs to be polyfilled 或替换为类似的 DOM 操作,例如jQueryprepend.

【讨论】:

猜你喜欢
  • 2015-04-20
  • 2023-03-31
  • 2011-05-30
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 2018-06-12
  • 2022-11-27
相关资源
最近更新 更多