如何在 React 18 中以编程方式创建模态框

问题描述 投票:0回答:1

我为 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
reactjs simplemodal
1个回答
1
投票

它以这种方式使用 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 函数。

如果您有更好的答案,那就太棒了。 :)

© www.soinside.com 2019 - 2024. All rights reserved.