弃用通知:React 18 不再支持 ReactDOM.render

SnN*_*aCk 241 javascript reactjs

每次创建新的 React 应用程序时都会出现此错误:

警告:ReactDOM.render 在 React 18 中不再支持。请改用 createRoot。在您切换到新 API 之前,您的应用程序的行为就像运行 React 17 一样。了解更多信息:https ://reactjs.org/link/switch-to-createroot

我该如何修复它?

我使用以下方法创建了我的 React 应用程序:

npx create-react-app my-app
Run Code Online (Sandbox Code Playgroud)

小智 404

在文件index.js中,更改为:

import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";

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

reportWebVitals();
Run Code Online (Sandbox Code Playgroud)

对于打字稿

来自下面评论部分的回答Kibonge Murphy

import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";

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

reportWebVitals();
Run Code Online (Sandbox Code Playgroud)

  • 对于打字稿支持``const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement);`` (64认同)
  • 现在我得到 `react-dom.development.js:86 警告:您正在从不受支持的“react-dom”导入 createRoot。你应该从“react-dom/client”导入它 (2认同)

Dre*_*ese 62

React 18 于 2022 年 3 月 29 日发布。ReactDOM.render已在 React 18 中弃用,目前会发出警告并以兼容模式运行。

弃用

弃用

  • react-dom:ReactDOM.render已被弃用。使用它会发出警告并以 React 17 模式运行您的应用程序。
  • react-dom:ReactDOM.hydrate已被弃用。使用它会发出警告并以 React 17 模式运行您的应用程序。
  • react-dom:ReactDOM.unmountComponentAtNode已被弃用。
  • react-dom:ReactDOM.renderSubtreeIntoContainer已被弃用。
  • react-dom/server:ReactDOMServer.renderToNodeStream已被弃用。

要解决此问题,您可以恢复到以前版本的 React 或更新您的 index.js 文件以与 React 18 语法保持一致。

例子:

import { StrictMode } from "react";
import { createRoot } from "react-dom/client";

import App from "./App";

const rootElement = document.getElementById("root");
const root = createRoot(rootElement);

root.render(
  <StrictMode>
    <App />
  </StrictMode>
);
Run Code Online (Sandbox Code Playgroud)

  • 对于 typescript 用户,您唯一需要做的就是添加 "devDependencies": { "@types/react-dom": "^18.0.0" }。就是这样。上面的 createRoot 代码很好。 (6认同)
  • 这是一个很好的答案。但是,如果您像我一样使用 Typescript,则需要在调用 createRoot 之前添加类似 ``` if (!rootElement) throw new Error('Failed to find the root element') ``` 的内容。 (4认同)

Joh*_*Pix 39

代替:

import ReactDOM from 'react-dom'
ReactDom.render(<h1>Your App</h1>, document.getElementById('root'))
Run Code Online (Sandbox Code Playgroud)

使用:

import { createRoot } from 'react-dom/client'
createRoot(document.getElementById('root')).render(<h1>Your App</h1>)
Run Code Online (Sandbox Code Playgroud)

更多详情请点击此处


小智 16

import { render } from 'react-dom';
const container = document.getElementById('app');
render(<App tab="home" />, container);
Run Code Online (Sandbox Code Playgroud)

import { createRoot } from 'react-dom/client';
const container = document.getElementById('app');
const root = createRoot(container);
root.render(<App tab="home" />);
Run Code Online (Sandbox Code Playgroud)

在你的index.js文件之前:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

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


reportWebVitals();
Run Code Online (Sandbox Code Playgroud)

将其如下更改到您的index.js文件中:

import React from 'react';

import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

import { createRoot } from 'react-dom/client';
const container = document.getElementById('root');
const root = createRoot(container);
root.render(<React.StrictMode>
  <App />
</React.StrictMode>);


reportWebVitals();
Run Code Online (Sandbox Code Playgroud)

  • 看到差异并不容易。并且应该有一个解释。例如,想法/要点是什么?来自[帮助中心](https://stackoverflow.com/help/promotion):*“...始终解释为什么您提出的解决方案是合适的以及它是如何工作的”*。请通过[编辑(更改)您的答案](https://stackoverflow.com/posts/71762741/edit) 进行回复,而不是在评论中回复(***没有***“编辑:”、“更新:”或类似 - 答案应该看起来像今天写的一样)。 (3认同)

小智 10

旧版根 APIReactDOM.render已在 React 18 中弃用,并替换为使用createRoot. 应用程序的根是包含所有渲染组件的顶级 DOM 元素,通常是<div>ID 为root.

React 18 仍然有支持,ReactDOM.render因此从技术上来说你不需要更新,但你无法确定这种支持会持续多久。

您可以在https://thelonecoder.dev/javascript/react-js/reactdom-render-vs-createroot/ReactDOM.render找到有关和之间差异的更多信息。createRoot

要更新到新的根 API,请将index.js文件更改为如下所示:

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

const root = createRoot(document.getElementById('root'));
root.render(<App />);
Run Code Online (Sandbox Code Playgroud)


QRr*_*bit 7

为了提供或多或少与以前版本的 React 等效的版本,我使用了上面的这个稍微精简的版本,仍然<App><React.StrictMode>.

我浓缩这一点的另一个原因是 - 在我的特定管道中 - 我永远不需要访问根变量,因此,将语句链接在一起对我来说更有意义,整个文件只有五行代码:

import React from 'react';
import ReactDOM from "react-dom/client";

import './index.css';
import App from './App';

    ReactDOM.createRoot(document.querySelector("#root")).render(<React.StrictMode><App /></React.StrictMode>);
Run Code Online (Sandbox Code Playgroud)

(PS:不要忘记您是否需要 webvitals 功能也添加到上述代码中)

最后,我使用 WebStorm IDE 将此起始代码保存为实时模板。根据您的 IDE,您的代码片段的调用方式可能会有所不同,但其想法应该是相似的。


Dyl*_*tle 6

正如您的错误所述,不再支持 ReactDOM.render。所以使用新的createRoot。

正如您从下面的代码中看到的,(从文档中提取)您所要做的就是用 createRoot 替换 ReactDOM.render 。

// Before
import { render } from 'react-dom';
const container = document.getElementById('app');
render(<App tab="home" />, container);

// After
import { createRoot } from 'react-dom/client';
const container = document.getElementById('app');
const root = createRoot(container);
root.render(<App tab="home" />);
Run Code Online (Sandbox Code Playgroud)


小智 6

正如您所说,您使用npx create-react-app my-app创建了 React 应用程序。

命令执行后,您的 index.js 必须如下所示:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

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

reportWebVitals();
Run Code Online (Sandbox Code Playgroud)

控制台中提到的编辑后的代码:

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

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

reportWebVitals();
Run Code Online (Sandbox Code Playgroud)

  • 您的“可运行”代码无法使用“import”语句在 stackoverflow 中运行 (2认同)

小智 5

在您的index.js文件中:

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
Run Code Online (Sandbox Code Playgroud)

在 React 版本 18 之前使用它

// ReactDOM.render(
//   <React.StrictMode>
//     <App />
//   </React.StrictMode>,
//   document.getElementById("root")
// );
Run Code Online (Sandbox Code Playgroud)

在 React 版本 18 中使用它

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
Run Code Online (Sandbox Code Playgroud)

  • 为什么第二部分(似乎)被评论过头了? (4认同)