TIL_67_Portal
Learn React Portal In 12 Minutes By Building A Modal
上のビデオに基づいて作られています.
企業提携4日目.プロジェクトを一緒に行う開発者は、なぜポータルサイトを使うのかを理解することが重要だと話しています.ジュンウがシェアしてくれたおかげで上の動画が見れました
一目で目立つ問題が見つかる.
モードウィンドウが表示されると、他にオクルージョンがないことを確認できます.ハーモニーを見てみましょう
次のモデルもjsファイルでは、1000個のzIndexがMODAL STYLESに提供されていることがわかります.どうしてモデルのzIndexはもっと高いのに、隠していないのですか?
理由はModelAppjsファイルを継承しているからです.
モードはAppです.jsコードからdivに囲まれていることがわかります.いくらModelの高いzIndexを与えても、サブコンポーネントは親コンポーネントを上書きすることはできません.他のコンテンツzIndexよりも低いBUTTONWRAPPER STYLESはOTHER CONTENT STYLESに隠されているだけです.
ポータルサイトを通じてこの問題を解決します.
ああ解決!
リアクション-構成部品を親構成部品の外部DOMにレンダリングします。
上のビデオに基づいて作られています.
企業提携4日目.プロジェクトを一緒に行う開発者は、なぜポータルサイトを使うのかを理解することが重要だと話しています.ジュンウがシェアしてくれたおかげで上の動画が見れました
一目で目立つ問題が見つかる.
モードウィンドウが表示されると、他にオクルージョンがないことを確認できます.ハーモニーを見てみましょう
// App.js
import React, { useState } from "react";
import Modal from "./Modal";
const BUTTON_WRAPPER_STYLES = {
position: "relative",
zIndex: 1,
};
const OTHER_CONTENT_STYLES = {
position: "relative",
zIndex: 2,
backgroundColor: "red",
padding: "10px",
};
export default function App() {
const [isOpen, setIsOpen] = useState(false);
return (
<>
<div style={BUTTON_WRAPPER_STYLES}>
<button onClick={() => setIsOpen(true)}>Open Modal</button>
<Modal open={isOpen} onClose={() => setIsOpen(false)}>
Fancy Modal
</Modal>
</div>
<div style={OTHER_CONTENT_STYLES}>Other Content</div>
</>
);
}
// Modal.js
import React from "react";
const MODAL_STYLES = {
position: "fixed",
top: "50%",
left: "50%",
transform: "translate(-50%, -50%)",
backgroundColor: "#FFF",
padding: "50px",
zIndex: 1000,
};
const OVERLAY_STYLES = {
position: "fixed",
top: 0,
left: 0,
right: 0,
bottom: 0,
backgroundColor: "rgba(0, 0, 0, .7)",
zIndex: 1000,
};
export default function Modal({ open, children, onClose }) {
if (!open) return null;
return (
<>
<div style={OVERLAY_STYLES} />
<div style={MODAL_STYLES}>
<button onClick={onClose}>Close Modal</button>
{children}
</div>
</>
);
}
上のコードを見て、App.jsファイルでは、OTHER CONTENT STYLESがzIndex 2に与えられていることがわかります.次のモデルもjsファイルでは、1000個のzIndexがMODAL STYLESに提供されていることがわかります.どうしてモデルのzIndexはもっと高いのに、隠していないのですか?
理由はModelAppjsファイルを継承しているからです.
モードはAppです.jsコードからdivに囲まれていることがわかります.いくらModelの高いzIndexを与えても、サブコンポーネントは親コンポーネントを上書きすることはできません.他のコンテンツzIndexよりも低いBUTTONWRAPPER STYLESはOTHER CONTENT STYLESに隠されているだけです.
ポータルサイトを通じてこの問題を解決します.
// index.html
<body>
<div id="root"></div>
<div id="portal"></div>
</body>
</html>
index.htmlのルートの下にportalというdivを作成します.// Modal.js
import React from "react";
import ReactDom from "react-dom";
// ReactDom을 import 를 해주고
const MODAL_STYLES = {
position: "fixed",
top: "50%",
left: "50%",
transform: "translate(-50%, -50%)",
backgroundColor: "#FFF",
padding: "50px",
zIndex: 1000,
};
const OVERLAY_STYLES = {
position: "fixed",
top: 0,
left: 0,
right: 0,
bottom: 0,
backgroundColor: "rgba(0, 0, 0, .7)",
zIndex: 1000,
};
export default function Modal({ open, children, onClose }) {
if (!open) return null;
return ReactDom.createPortal(
// 리턴 옆에 ReactDom.createPortal 를 선언.
<>
<div style={OVERLAY_STYLES} />
<div style={MODAL_STYLES}>
<button onClick={onClose}>Close Modal</button>
{children}
</div>
</>,
document.getElementById("portal")
// document.getElementById("portal") 선언.
);
}
ああ解決!
リアクション-構成部品を親構成部品の外部DOMにレンダリングします。
Reference
この問題について(TIL_67_Portal), 我々は、より多くの情報をここで見つけました https://velog.io/@poohv7/TIL67Portalテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol