我为 React 17 做了一个以编程方式创建模态的函数,您只需要调用一个函数来创建一个新的模态。
在 ReactDOM.render 被弃用之前,它运行得非常好。
有没有办法在 React 18 中用其他东西来替换渲染函数?现在 createRoot 函数仅适用于根组件,我想在指定的 DOM 元素中渲染简单组件。
它的工作原理如下:
app.jsx
<button onClick={() => createModal(<h1>I'm a component inside a modal</h1>)}>Open Modal</button>
它处理自己的状态,如果您想在几秒钟内制作一堆模态框,这非常有用。
这是代码:
index.js => 这是容器。
import React from 'react'
import ReactDOM from 'react-dom'
import './index.scss'
import App from './App.jsx'
ReactDOM.render(
<React.StrictMode>
<div id="modal-container"></div> <- This is the container
<App />
</React.StrictMode>,
document.getElementById('root')
)
Modal/Modal.jsx => 模态组件。
import { useState } from 'react'
import './Modal.scss'
const Modal = ({ content }) => {
const [isOpen, setIsOpen] = useState(true)
if (isOpen) {
return (<>
<div className="modal-background" onClick={() => setIsOpen(false)} />
<div className="modal-content" >
{content}
</div>
<button onClick={() => setIsOpen(false)} className="close-button" >Close</button>
</>)
} else return null
}
export default Modal
Modal/index.js => 调用函数:
import { render } from "react-dom"
import Modal from "./Modal"
const createModal = (content) => render(
<Modal key={Math.random()} content={content} />, document.getElementById("modal-container")
)
export default createModal
它以这种方式使用 createRoot 来工作,而不是渲染:
这是一个示例:CodeSandbox
模态/index.js
import { createRoot } from 'react-dom/client'
import Modal from "./Modal"
const createModal = (content) => {
if (!window.modalContainer) {
window.modalContainer = createRoot(document.getElementById('modal-container'))
}
window.modalContainer.render(<Modal key={Math.random()} content={content} />)
}
export default createModal
它检查指定组件上的 createRoot 是否之前被调用过,因此它只调用 createRoot 一次,并且每次创建新模态时都会调用 render 函数。
如果您有更好的答案,那就太棒了。 :)