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

标签 javascript reactjs dom

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

我使用 createPortal 得到的是:

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

我要实现的目标:

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

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

最佳答案

React 将使用 appendChild 来呈现门户,此行为是固有的,不会更改。

如果一个 portal 应该在其他 child 之前显示,则应该在现有的 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 操作,例如jQuery 前置

关于javascript - 将 ReactDOM.createPortal 插入元素作为目标容器的第一个子元素(而不是最后一个子元素),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52658703/

相关文章:

javascript - <select> 标签并将多个值返回给 javascript 方法

javascript - 当其他进程正在运行时,React Native onPress 无法触发

javascript - 是否有用于文本字段的 jQuery 自动增长插件?

javascript - React JS - 调用作为 prop 传递的函数

javascript - 使用 React 检测 DOM 元素任意位置的点击

ajax - 使用对象中的更改更新 DOM (vue.js) - 绑定(bind)不起作用?

javascript - 将变量传递给canvasjs中的数据点

javascript - 将位置从绝对位置更改为固定位置时意外跳转,为什么?

reactjs - 不使用 Immutability Helper 从嵌套数组中删除元素

php - 有没有更好的方法来更改 PHP 中的 DOMElement->tagName 属性?