0043. ReactDOM.render
- 1. 📝 概述
- 2. ⚠️ 兼容性问题 - 从 v18 开始,不再支持 ReactDOM.render 这个 API
- 3. ⚙️
ReactDOM.render
- 4. 💻 demos.1 -
ReactDOM.render
的基本使用示例 - 5. ⚙️
ReactDOM.createRoot
- 6. 💻 demos.2 -
ReactDOM.createRoot
的基本使用示例 - 7. 🤔 为什么弃用
ReactDOM.render
?
1. 📝 概述
ReactDOM.render
是 React 17 及之前版本的核心 API,用于将 React 元素渲染到 DOM 中。- 在 React 18 中,它被废弃,推荐使用
ReactDOM.createRoot
,以支持更现代化的并发渲染特性。 - 如果你正在使用 React 18 或更高版本,请迁移到新的 API,以利用 React 的性能优化和新特性。
2. ⚠️ 兼容性问题 - 从 v18 开始,不再支持 ReactDOM.render 这个 API
- 在 React 17 及以前的版本中,
ReactDOM.render
是一个常用的 API,但随着 React 18 的推出,ReactDOM.render
被替代为ReactDOM.createRoot
,并逐渐被废弃。 - 🔍 查看官方文档对此的描述
js
// Before v18
import { render } from 'react-dom'
const container = document.getElementById('app')
render(<App tab="home" />, container)
// After v18
import { createRoot } from 'react-dom/client'
const container = document.getElementById('app')
const root = createRoot(container) // createRoot(container!) if you use TypeScript
root.render(<App tab="home" />)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
3. ⚙️ ReactDOM.render
ReactDOM.render
的基本语法
javascript
ReactDOM.render(element, container[, callback])
1
element
:需要渲染的 React 元素,通常是由React.createElement
创建的元素或 JSX。container
:渲染的目标 DOM 容器。callback
(可选):渲染完成后执行的回调函数。
ReactDOM.render
的作用:渲染 react 组件到指定的 DOM 容器中。
javascript
import React from 'react'
import ReactDOM from 'react-dom'
function App() {
return <h1>Hello, React!</h1>
}
ReactDOM.render(<App />, document.getElementById('root'))
// 将 App 组件渲染到 id 为 "root" 的 DOM 容器中。
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
4. 💻 demos.1 - ReactDOM.render
的基本使用示例
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<!-- 接下来要渲染内容的容器 -->
<div id="root"></div>
<!-- React 的核心库 react,与宿主环境无关。 -->
<script
crossorigin
src="https://unpkg.com/react@17/umd/react.development.js"
></script>
<!-- React 依赖核心库 react-dom,将 react 库的核心功能与页面结合,依赖于浏览器环境。 -->
<script
crossorigin
src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"
></script>
<script>
// 创建一个 H1 元素
const h1 = React.createElement('h1', {}, 'Hello World')
// 将 H1 元素渲染到 root 容器中
ReactDOM.render(h1, document.getElementById('root'))
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
- 最终渲染结果如下图所示:
5. ⚙️ ReactDOM.createRoot
ReactDOM.render
的替代品:ReactDOM.createRoot
- 在 React 18 中,
ReactDOM.render
被标记为过时,取而代之的是新的 Concurrent Mode 渲染 API:
javascript
import React from 'react'
import ReactDOM from 'react-dom/client'
function App() {
return <h1>Hello, React 18!</h1>
}
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<App />)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
6. 💻 demos.2 - ReactDOM.createRoot
的基本使用示例
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<div id="root"></div>
<script type="module">
import React from 'https://esm.sh/react@19/?dev'
import ReactDOM from 'https://esm.sh/react-dom@19/client?dev'
// 创建一个 H1 元素
const h1 = React.createElement('h1', {}, 'Hello World')
// 将 H1 元素渲染到 root 容器中
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(h1)
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- 最终渲染结果和 demos.1 是完全一样的。
7. 🤔 为什么弃用 ReactDOM.render
?
- 支持并发渲染(Concurrent Rendering)
- React 18 引入了并发模式,提高了渲染性能和响应性。
ReactDOM.render
无法支持此模式。
- 改进的 API 设计
ReactDOM.createRoot
更加灵活,未来可以更好地支持新特性。
- 提高渲染稳定性
- 新 API 提供了更强的控制能力,使 React 在渲染过程中可以处理更多复杂的场景。