您不能从事件处理程序返回组件。在反应中处理事件的方法几乎总是改变触发重新渲染的应用程序的状态。在您的情况下,您需要跟踪模态的 open 状态。
这可以通过受控方式(您自己跟踪打开状态并将其作为道具传递给<Modal> 组件)或以不受控制的方式完成(<Modal> 组件管理open状态本身)。第二种方法要求您提供例如要呈现给您的 Modal 组件的元素,充当触发器:
const MyModal = ({ children, trigger }) => {
const [modal, setModal] = useState(false);
const toggle = () => setModal(!modal);
return (
<div>
{React.cloneElement(trigger, { onClick: toggle })}
<Modal isOpen={modal} toggle={toggle}>
<ModalBody>{children}</ModalBody>
</Modal>
</div>
);
};
那么你可以这样使用它:
<MyModal trigger={<Button variant="primary">Send</Button>}>
<p>This is the content.</p>
</MyModal>
或者您可以以可控的方式实现它。这更灵活,因为它允许您在任何地方渲染触发元素:
const MyModal = ({ children, isOpen, toggle }) => (
<div>
<Modal isOpen={isOpen} toggle={toggle}>
<ModalBody>{children}</ModalBody>
</Modal>
</div>
);
用法示例:
function App() {
const [isOpen, setIsOpen] = useState(false);
const toggle = () => setIsOpen(!isOpen);
return (
<div className="App">
<Button variant="primary" onClick={toggle}>
Send
</Button>
<MyModal isOpen={isOpen} toggle={toggle}>
<p>This is the content.</p>
</MyModal>
</div>
);
}