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&spm=1001.2101.3001.4242</p>
<h2><code>createProtal</code> 改造 Modal 组件</h2>
<p>在 html 中除了 <code>div#root</code> 之外,给 Modal 预留了一个新的 <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> 将 ModalContent 挂载到 ModalContainer </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 = () => {</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><div className=<span class="hljs-string">"App"></span></p>
<p><<span class="hljs-type">ModalContainer></span></p>
<p><<span class="hljs-type">ModalContent /></span></p>
<p></<span class="hljs-type">ModalContainer></span></p>
<p></div>);</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(<Foo />, 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 = () => {<br>return <div style={styles}>Portals的使用</div>;<br>};</p>
<p> </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(<Foo />, 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 = () => {<br>return (<br> <div onClick={() => console.info("触发点击事件")} style={styles}><br> Portals的使用<br> </div><br>);<br>};</p>
<p>export default () => (<br><div<br> style={{ border: "1px solid red" }}<br> onClick={() => console.info("点击事件冒泡到其React的虚拟DOM父节点")}<br>><br> <p>React虚拟DOM父节点</p><br> <App /><br></div><br>);</p>
<p> 事件的传递有效,在Foo组件触发的click事件,依然会传递到App组件</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/zwjun/p/13718562.html
頁:
[1]