gpt4 book ai didi

javascript - 如何在 React 16 中使用 ReactDOM.createPortal() ?

转载 作者:行者123 更新时间:2023-12-03 13:00:38 25 4
gpt4 key购买 nike

我正在使用 React 16 并需要门户,但无法找到有关此功能的任何文档。有谁知道如何使用这个吗?

https://github.com/facebook/react/pull/10675

感谢您的建议。

最佳答案

React v16 几个小时前刚刚发布(耶!!),正式支持 Portal .

什么是门户?自从那里存在多久了?

Portals provide a first-class way to render children into a DOM node that exists outside the DOM hierarchy of the parent component.

Portal在 React 社区中并不是新概念。许多库都支持这种功能。例如react-portalreact-gateway .

渲染任何 React 应用程序时会发生什么?

通常,在渲染任何 React 应用程序时,会使用单个 DOM 元素来渲染整个 React 树。

class HelloReact extends React.Component {
render() {
return (
<h1>Hello React</h1>
);
}
}

ReactDOM.render(<HelloReact />, document.getElementById('root'));

正如你所看到的,我们正在将 React 组件渲染到一个 id 为 root 的 DOM 元素中。 .

什么是 Portal?为什么需要它?为什么它在那里?

门户是一种在父组件的主 DOM 层次结构之外渲染 React 子组件的方法,不会丢失 React 上下文。我之所以强调它是因为非常受欢迎的库,例如 react-router , redux大量使用 react 上下文。因此使用 Portal 时上下文可用性非常有帮助。

根据 react文档,

A typical use case for portals is when a parent component has an overflow: hidden or z-index style, but you need the child to visually "break out" of its container. For example, dialogs, hovercards, and tooltip.

因此,通过门户,您可以在需要时将并行 react 树渲染到另一个 DOM 节点上。即使它是在不同的 DOM 节点中渲染的,父组件也可以捕获未捕获的事件。看这个codepen文档本身提供了。

下面的例子应该会给你更多的想法:

// index.html
<html>
<body>
<div id="root"></div>
<div id="another-root"></div>
</body>
</html>

// index.jsx
const mainContainer = document.getElementById('root');
const portalContainer = document.getElementById('another-root');

class HelloFromPortal extends React.Component {
render() {
return (
<h1>I am rendered through a Portal.</h1>
);
}
}

class HelloReact extends React.Component {
render() {
return (
<div>
<h1>Hello World</h1>
{ ReactDOM.createPortal(<HelloFromPortal />, portalContainer) }
</div>
);
}
}

ReactDOM.render(<HelloReact />, mainContainer);

https://codesandbox.io/s/62rvxkonnw

您可以使用devtools检查元素并看到<h1>I am rendered through a Portal.</h1>被渲染在 #another-root 内标签,而 <h1>Hello World</h1>被渲染在 #root 内标签。

希望这有帮助:)

更新:回答 @PhillipMunin's comment

What is the different between ReactDOM.render and ReactDOM.createPortal?

  1. 即使通过门户呈现的组件在其他地方呈现(当前容器根目录之外),它仍然作为同一父组件的子组件存在。 (谁调用了 ReactDOM.createPortal )因此子级上的任何事件都会传播到父级。 (Ofc,如果您手动停止事件的传播,这将不起作用。)

  2. 可以在通过门户呈现的组件内部访问相同的上下文。但当我们这样做 ReactDOM.render 时情况并非如此直接。

我创建了另一个演示来说明我的观点。 https://codesandbox.io/s/42x771ykwx

关于javascript - 如何在 React 16 中使用 ReactDOM.createPortal() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46393642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com