render 将一段 JSX(“React 节点”)渲染到浏览器 DOM 节点中。
render(reactNode, domNode, callback?)参考
render(reactNode, domNode, callback?)
调用 render 以在浏览器 DOM 元素内显示 React 组件。
import { render } from 'react-dom';
const domNode = document.getElementById('root');
render(<App />, domNode);React 会在 domNode 中显示 <App />,并接管对其内部 DOM 的管理。
完全使用 React 构建的应用程序通常只有一个带有其根组件的 render 调用。 对页面部分内容使用 React“点缀”的页面可以根据需要进行多次 render 调用。
参数
-
reactNode:要显示的 *React 节点*。这通常是一段 JSX,例如<App />,但您也可以传递使用createElement()构造的 React 元素、字符串、数字、null或undefined。 -
domNode:一个DOM 元素。 React 会在您传递的此 DOM 元素内显示reactNode。从这一刻起,React 将管理domNode内部的 DOM,并在 React 树发生更改时更新它。 -
可选
callback:一个函数。如果传递,React 会在您的组件被放置到 DOM 中后调用它。
返回值
render 函数通常返回 null。但是,如果传递的 reactNode 是一个*类组件*,则它将返回该组件的一个实例。
注意事项
-
在 React 18 中,
render已被createRoot替代。请在 React 18 及更高版本中使用createRoot。 -
第一次调用
render时,React 会在将 React 组件渲染到domNode中之前,清除domNode内所有现有的 HTML 内容。如果domNode包含由 React 在服务器端或构建期间生成的 HTML,请改用hydrate(),它会将事件处理程序附加到现有的 HTML。 -
如果在同一个
domNode上多次调用render,React 将根据需要更新 DOM 以反映传递的最新 JSX。React 将通过与之前渲染的树进行 “匹配” 来确定 DOM 的哪些部分可以重用,哪些部分需要重新创建。在同一个domNode上再次调用render类似于在根组件上调用set函数:React 会避免不必要的 DOM 更新。 -
如果应用程序完全使用 React 构建,则应用程序中可能只有一个
render调用。(如果使用框架,它可能会为你进行此调用。)如果想在组件子级之外的 DOM 树的不同部分(例如,模态框或工具提示)中渲染一段 JSX,请使用createPortal而不是render。
用法
调用 render 函数可以在 浏览器 DOM 节点 内显示 React 组件。
import { render } from 'react-dom';
import App from './App.js';
render(<App />, document.getElementById('root'));渲染根组件
在完全使用 React 构建的应用中,通常只会在启动时执行一次——以渲染“根”组件。
import './styles.css'; import { render } from 'react-dom'; import App from './App.js'; render(<App />, document.getElementById('root'));
通常情况下,不需要再次调用 render 或在更多的地方调用它。从现在开始,React 将管理应用程序的 DOM。要更新 UI,组件将 使用状态。
渲染多个根节点
如果页面 不是完全使用 React 构建,则为 React 管理的每个顶级 UI 部分调用 render。
import './styles.css'; import { render } from 'react-dom'; import { Comments, Navigation } from './Components.js'; render( <Navigation />, document.getElementById('navigation') ); render( <Comments />, document.getElementById('comments') );
可以使用 unmountComponentAtNode() 销毁渲染的树。
更新渲染的树
可以在同一个 DOM 节点上多次调用 render。只要组件树结构与之前渲染的结构相匹配,React 就会 保留状态。 请注意,如何在输入框中键入内容,这意味着每秒重复调用 render 进行的更新不会破坏性地更新。
import { render } from 'react-dom'; import './styles.css'; import App from './App.js'; let i = 0; setInterval(() => { render( <App counter={i} />, document.getElementById('root') ); i++; }, 1000);
多次调用 render 并不常见。通常,会在组件内部 更新状态。