【问题标题】:How to programatically render a component in React 18如何以编程方式在 React 18 中渲染组件
【发布时间】:2022-12-13 08:41:15
【问题描述】:

我做了一个函数,它以编程方式为 React 17 创建模态,你只需要调用一个函数来创建一个新的模态。

它在之前工作得很好ReactDOM.render已弃用。

有没有办法代替React 18 中的渲染函数和其他东西?现在的创建根函数仅针对根组件,我想在指定的 DOM 元素中渲染简单的组件。

它是这样工作的:

应用程序.jsx

<button onClick={() => createModal(<h1>I'm a component inside a modal</h1>)}>Open Modal</button>

它处理它自己的状态,如果你想在几秒钟内制作一堆模态,这非常有用。

这是代码:

索引.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.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

模态/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

【问题讨论】:

  • 您是否尝试过在 React 中使用“门户”概念?看起来与您要完成的任务非常相似。 reactjs.org/docs/portals.html
  • 在你的情况下,你应该将这个&lt;div id="modal-container"&gt;&lt;/div&gt;移动到rootdiv之上\public\index.html页面
  • 感谢您的回复!不幸的是,它不起作用,无论我怎么做,createPortal 在将它与函数一起使用时都不会呈现任何内容。 :(

标签: reactjs react-hooks render simplemodal react-18


【解决方案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,并且在创建新模态时调用渲染函数。

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

【讨论】:

  • 什么是 modalContainer ?我有一个类似的问题,这是问题链接stackoverflow.com/questions/73518170/…
  • @zahrazamani 它是一个全局变量,包含一个新的“root”……在 HTML 中,全局范围是 window 对象,即 window.modalContainer = "Any value you want"……原因是;你要多次渲染一个模态,但你不能多次调用 [createRoot] ...... 所以你只创建一个新的“根”,并将其存储为全局变量window.modalContainer ,所以你可以每次都使用它,而不必每次都调用“createRoot”。
  • 我尝试使用此方法,但仍然收到此警告:您正在对之前已传递给 createRoot() 的容器调用 ReactDOMClient.createRoot()。相反,如果要更新它,请在现有根上调用 root.render() 。
  • @zahrazamani 我用一个工作示例和一些额外的选项为你做了一个CodeSanbox...我希望它能有所帮助...一切都在文件夹"/components/modal"中,只记得在索引文件中添加容器&lt;div id="modal-container" /&gt; .
猜你喜欢
  • 2020-08-12
  • 2011-10-09
  • 2018-09-10
  • 2022-06-12
  • 2022-11-14
  • 1970-01-01
  • 2022-07-27
  • 2023-02-10
  • 1970-01-01
相关资源
最近更新 更多