老师,多次点击报错ReactDOM.createRoot重复绑定,请问怎么解决呢

来源:16-9 createPortal传送门与逻辑组件的实现

Panda_io

2023-05-29

Warning: You are calling ReactDOMClient.createRoot() on a container that has already been passed to createRoot() before. Instead, call root.render() on the existing root instead if you want to update it.

import ReactDOM from 'react-dom/client'
import './message.scss'
import { CSSTransition } from 'react-transition-group'
import { useRef, useState} from 'react'

function Message({ icon, text }) {
    const nodeRef = useRef(null)
    const [prop, setProp] = useState(true)
    const handleEntered = () => {
        setTimeout(() => {
            setProp(false)
        },2000)
    }
    return (
        <CSSTransition in={prop} timeout={1000} classNames="Message" 
        nodeRef={nodeRef} appear onEntered={handleEntered} unmountOnExit>
            <div className="Message" ref={nodeRef}>{icon} {text}</div>
        </CSSTransition>

    )
}

const message = {
    success(text) {
        const message = ReactDOM.createRoot(document.querySelector("#message"))
        message.render(<Message text={text} icon="√" />)
    }
}
export default function App() {
    const handleClick = () => {
        message.success('登录成功')
    }
    return (
        <>
            <button onClick={handleClick}>点击</button>
        </>
    )
}

写回答

1回答

西门老舅

2023-05-29

你好,只需要判断一下,只触发一次就可以解决

const message = {

    success(text) {

        if(!this.container) {

          this.container = ReactDOM.createRoot(document.querySelector("#message"))

          this.container.render(<Message text={text} icon="√" />)

        }

    }

}


0
3
Panda_io
回复
西门老舅
谢谢老师unmount为我提供了新思路,本以为一般不去unmount,现在才理解可以灵活unmount,万分感谢
2023-05-31
共3条回复

Vue3 + React18 + TS4入门到实战 系统学习3大热门技术

专为初级前端人员设计,系统性学习三大技术

261 学习 · 182 问题

查看课程