在使用 React 18 的 createRoot API 时,为什么直接调用 ReactDOM.render 会触发警告?如何正确迁移旧项目?

在使用 React 18 的 createRoot API 时,为什么直接调用 ReactDOM.render 会触发警告?如何正确迁移旧项目?

回答与解析:

React 18 引入了新的根渲染器(Root API),通过 createRoot 替代了旧的 ReactDOM.render 方法。当你在 React 18+ 环境中继续使用 ReactDOM.render(),React 会发出运行时警告:

Warning: ReactDOM.render is no longer supported in React 18. Use createRoot instead.

这是因为 ReactDOM.render 属于“Legacy Root API”,它不支持 React 18 的并发特性(如自动批处理、可中断渲染等)。虽然代码可能暂时还能运行(出于向后兼容考虑),但官方明确表示该方法将在未来版本中移除。

正确迁移方式:

旧代码(React 17 及以下):

import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));

新写法(React 18+):

import { createRoot } from 'react-dom/client';
import App from './App';

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

注意:

  • 不再需要 import ReactDOM,而是从 react-dom/client 中引入 createRoot;
  • 需要显式创建 root 实例,再调用其 render 方法;
  • 如果使用 StrictMode,只需包裹在 root.render 内部即可,无需额外改动。

此迁移不仅消除警告,还让应用能利用 React 18 的新特性,如自动批处理状态更新、流式 SSR 等。

发表评论 (审核通过后显示评论):

昵称:
邮箱:
内容: