You are calling ReactDOMClient.createRoot() on a container that has already been passed

这篇博客讨论了在React应用中遇到的一个警告:不应当在已存在根元素上再次调用ReactDOM.createRoot()。解决方法是,在使用store.subscribe监听状态变化时,避免重新创建根元素,而是直接调用root.render()更新已存在的根。这涉及到React的渲染管理和版本差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

控制台问题:

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.

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import store from "./redux/store";


const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

//  检测redux 状态 发生变化 整个app 都调用 render()  作用是不用重复写 componentDidMount
store.subscribe(  () => {
    //不再创建 调用 createRoot 控制台就不报错了 程序正常运行 控制台输出也 ok  老师的旧版本可以 新版本就不行了
     // const root = ReactDOM.createRoot(document.getElementById('root'));
    root.render(
        <React.StrictMode>
            <App />
        </React.StrictMode>
    );
 })
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals

处理方案:根本原因 版本跟老师的不同,处理方法也不同
调用subscribe 监控 时 不再创建虚拟dom就行
// const root = ReactDOM.createRoot(document.getElementById(‘root’));

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值