Reactjs 如何使用createPortal()关闭React模式?
试图从模式对话框中取消模式对话框。我正在使用ReactDOM.createPortal() index.htmlReactjs 如何使用createPortal()关闭React模式?,reactjs,modal-dialog,Reactjs,Modal Dialog,试图从模式对话框中取消模式对话框。我正在使用ReactDOM.createPortal() index.html <body> <noscript> You need to enable JavaScript to run this app. </noscript> <div id="root"></div> <div id="modal"></div> <
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
<div id="modal"></div>
</body>
您需要启用JavaScript才能运行此应用程序。
ResponseModal.js
import React from "react";
import ReactDOM from "react-dom";
// The gray background
const backdropStyle = {
...
};
// The modal "window"
const modalStyle = {
...
};
const MODAL_ROOT = document.querySelector("#modal");
const JSX_MODAL = ({ children, setShowResponses }) => (
<div style={backdropStyle}>
<div style={modalStyle}>
Child: {children}
<br />
<input
type="button"
value="Dismiss"
onClick={() => {
setShowResponses(false);
}}
/>
</div>
</div>
);
function Modal({ showResponses, ...props }) {
console.log("floop", showResponses);
if (showResponses) {
return ReactDOM.createPortal(JSX_MODAL(props), MODAL_ROOT);
}
return null;
}
export default Modal;
从“React”导入React;
从“react dom”导入react dom;
//灰色背景
常量backdropStyle={
...
};
//模态“窗口”
常数modalStyle={
...
};
const MODAL_ROOT=document.querySelector(“MODAL”);
const JSX_MODAL=({children,setShowResponses})=>(
子:{children}
{
设置显示响应(假);
}}
/>
);
函数模态({showResponses,…props}){
console.log(“floop”,showResponses);
如果(显示响应){
返回ReactDOM.createPortal(JSX_MODAL(props),MODAL_ROOT);
}
返回null;
}
导出默认模式;
最后,包含组件:
const LargeCell = ({ SCID, extra, fen, color }) => {
const [showResponses, setShowResponses] = useState(false);
return (
<div
style={{
...
}}
onClick={() => setShowResponses(true)}
>
<SmallCell {...{ SCID, color }} />
<DiagramForCell {...{ fen }} padding="3em"></DiagramForCell>
<span className="diff-text opening-text">{extra.opening.desc}</span>
<ResponsesModal {...{ showResponses, setShowResponses }}>
FLUM!
</ResponsesModal>
</div>
);
};
constlargecell=({SCID,extra,fen,color})=>{
const[showResponses,setShowResponses]=useState(false);
返回(
setShowResponses(真)}
>
{extra.opening.desc}
弗罗姆!
);
};
单击LargeCell div时,我看到:
但是,“取消”按钮不起作用。我确信调用了setShowResponses(false),但是没有对模态进行重新渲染,因此它不会被忽略。如果我查看Chrome开发工具中的模态组件,showResponses的状态仍然显示true
所以问题是:消除这种模式的正确方法是什么?所以LargeCell是一个表单元格组件,其中有多个。我所做的是将模态推送到表级别,并在那里显示/隐藏它:
{showResponses ? (
<ResponsesModal {...{ setShowResponses }}>FLUM!</ResponsesModal>
) : null}
{showResponses(
弗罗姆!
):null}
setShowResponses由模式中的Disclose按钮调用,如前所示
缺点是,为了建立模型,每个大单元也需要设置显示响应。那道具必须向下推几层。现在没关系,但我开始怀疑是否应该使用上下文