余多先生 發表於 2020-9-23 15:13:00

React.createPortal()

<p>https://blog.csdn.net/sd19871122/article/details/97612107</p>
<p>https://blog.csdn.net/mmzzll2019/article/details/89348085?utm_medium=distribute.pc_relevant.none-task-blog-title-3&amp;spm=1001.2101.3001.4242</p>
<h2><code>createProtal</code>&nbsp;改造 Modal 组件</h2>
<p>在 html 中除了&nbsp;<code>div#root</code>&nbsp;之外,给 Modal 预留了一个新的&nbsp;<code>div#modal-root</code>,:</p>
<ol class="hljs-ln">
<li>
<div class="hljs-ln-code">
<div class="hljs-ln-line"><span class="hljs-keyword">const appRoot = <span class="hljs-built_in">document.getElementById(<span class="hljs-string">'root');</span></span></span></div>
</div>
</li>
<li>
<div class="hljs-ln-numbers">const modalRoot = <span class="hljs-built_in">document.getElementById(<span class="hljs-string">'modal-root');</span></span></div>
</li>
</ol>
<h3>改造 Modal 容器</h3>
<p>新的 Modal 容器组件内容如下:  </p>
<p><span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">ModalContainer <span class="hljs-keyword">extends <span class="hljs-title">Component {</span></span></span></span></span></p>
<p>constructor(props) {<span class="hljs-keyword">super(props);</span></p>
<p><span class="hljs-keyword">this.el = document.createElement(<span class="hljs-symbol">'div');</span></span>}</p>
<p>componentDidMount()</p>
<p>{modalRoot.appendChild(<span class="hljs-keyword">this.el);</span>}</p>
<p>componentWillUnmount()</p>
<p>{modalRoot.removeChild(<span class="hljs-keyword">this.el);</span>}</p>
<p>render() {<span class="hljs-keyword">return <span class="hljs-type">ReactDOM.createPortal(</span></span><span class="hljs-keyword">this.props.children,</span><span class="hljs-keyword">this.el</span>);}}</p>
<p>&nbsp;将 ModalContent 挂载到 ModalContainer&nbsp;</p>
<p><span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">App2 <span class="hljs-keyword">extends <span class="hljs-title">Component {</span></span></span></span></span></p>
<p>state = {</p>
<p>name: <span class="hljs-symbol">'clickme'</span></p>
<p>}</p>
<p>componentDidMount(){</p>
<p><span class="hljs-comment">// console.log(findDOMNode(ref.current))</span></p>
<p>}</p>
<p>clickHandle = () =&gt; {</p>
<p><span class="hljs-keyword">this.setState({</span></p>
<p>name: <span class="hljs-symbol">'clickme' + <span class="hljs-type">Date.now()</span></span></p>
<p>});</p>
<p>}</p>
<p>render() {</p>
<p><span class="hljs-keyword">return (</span></p>
<p>&lt;div className=<span class="hljs-string">"App"&gt;</span></p>
<p>&lt;<span class="hljs-type">ModalContainer&gt;</span></p>
<p>&lt;<span class="hljs-type">ModalContent /&gt;</span></p>
<p>&lt;/<span class="hljs-type">ModalContainer&gt;</span></p>
<p>&lt;/div&gt;);</p>
<p>}}</p>
<p><strong>创建一个Foo组件(表现为200*200的div),放到body的中央位置。</strong></p>
<p>import React from "react";<br>import ReactDom from "react-dom";</p>
<p>export default class extends React.Component {<br>div = document.createElement("div");</p>
<p>componentWillUnmount() {<br>    document.body.removeChild(this.div);<br>}</p>
<p>componentDidMount() {<br>    document.body.appendChild(this.div);<br>}</p>
<p>render() {<br>    return ReactDom.createPortal(&lt;Foo /&gt;, this.div);<br>}<br>}</p>
<p>const styles = {<br>position: "absolute",<br>top: "50%",<br>left: "50%",<br>transform: "translate(-50%, -50%)",<br>width: 200,<br>height: 200,<br>zIndex: 100,<br>background: "rgba(222,222,222,0.4)",<br>boxShadow: "5px 5px 5px 5px gray"<br>};<br>const Foo = () =&gt; {<br>return &lt;div style={styles}&gt;Portals的使用&lt;/div&gt;;<br>};</p>
<p>&nbsp;</p>
<h2>Portals的事件传递</h2>
<p>import React from "react";<br>import ReactDom from "react-dom";</p>
<p>class App extends React.Component {<br>div = document.createElement("div");</p>
<p>componentWillUnmount() {<br>    document.body.removeChild(this.div);<br>}</p>
<p>componentDidMount() {<br>    document.body.appendChild(this.div);<br>}</p>
<p>render() {<br>    return ReactDom.createPortal(&lt;Foo /&gt;, this.div);<br>}<br>}</p>
<p>const styles = {<br>position: "absolute",<br>top: "50%",<br>left: "50%",<br>transform: "translate(-50%, -50%)",<br>width: 200,<br>height: 200,<br>zIndex: 100,<br>background: "rgba(222,222,222,0.4)",<br>boxShadow: "5px 5px 5px 5px gray"<br>};<br>const Foo = () =&gt; {<br>return (<br>    &lt;div onClick={() =&gt; console.info("触发点击事件")} style={styles}&gt;<br>      Portals的使用<br>    &lt;/div&gt;<br>);<br>};</p>
<p>export default () =&gt; (<br>&lt;div<br>    style={{ border: "1px solid red" }}<br>    onClick={() =&gt; console.info("点击事件冒泡到其React的虚拟DOM父节点")}<br>&gt;<br>    &lt;p&gt;React虚拟DOM父节点&lt;/p&gt;<br>    &lt;App /&gt;<br>&lt;/div&gt;<br>);</p>
<p>&nbsp;事件的传递有效,在Foo组件触发的click事件,依然会传递到App组件</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/zwjun/p/13718562.html
頁: [1]
查看完整版本: React.createPortal()