多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 渲染元素 元素是 React apps 中最小化的构建块。 一个元素描述了你希望在屏幕上看到的东西: ~~~ const element = <h1>Hello, world</h1>; ~~~ 和浏览器的 DOM 元素不同, React 元素是扁平对象,非常容易创建。React DOM 会负责更新 DOM 来匹配 React 元素。 > 注意: 有人可能会混淆元素和广泛认知的概念“组件”。我们将在下一节引入组件。元素是构成组件的部分,我们鼓励你在继续之前阅读这个章节。 ## 渲染一个元素到 DOM 假设在你的 HTML 文件中有一个 `<div>` : ~~~ <div id="root"></div> ~~~ 我们称这个是一个 根 DOM 节点,因为其中的任何内容都会被 React DOM 管理。 只使用 React 构建的应用通常只有一个单独的根 DOM 节点。如果你是集成 React 到一个已有的 app,可能有许多孤立的根 DOM 节点。 要渲染一个 React 元素到一个 根 DOM 节点,传递它们到 ReactDOM.render() 方法中: ~~~ const element = <h1>Hello, world</h1>; ReactDOM.render( element, document.getElementById('root') ); ~~~ 它会在页面上显示 "Hello World" 。可以在[ CodePen 中](http://codepen.io/gaearon/pen/rrpgNB?editors=1010)打开看看。 ## 更新一个渲染的 React 元素 React 元素是[不可变的](https://en.wikipedia.org/wiki/Immutable_object)。一旦你创建了一个元素,就不能再修改它的子元素或者属性。一个元素就像一个单独的电影中的帧:它表示在某个时间点的 UI 。 我们迄今的知识,更新 UI 唯一的方式是创建一个新的元素,并传递它到 ReactDOM.render() 中。 思考这个时钟的例子: ~~~ function tick() { const element = ( <div> <h1>Hello, world!</h1> <h2>It is {new Date().toLocaleTimeString()}.</h2> </div> ); ReactDOM.render( element, document.getElementById('root') ); } setInterval(tick, 1000); ~~~ 或者在 CodePen 中[打开它](http://codepen.io/gaearon/pen/gwoJZk?editors=0010)。 它每秒都会从一个 setInterval() 的回调中调用 ReactDOM.render()。 > 注意: 在实际中,多数 React apps 只调用 ReactDOM.render() 一次。下一节我们将了解折衷代码如何封装到有状态的组件中。我们建议不要跳过话题,因为它们基于彼此。 ## React 只更新需要更新的 ReactDOM 把元素和它的子元素跟之前的进行对比,只应用必须的 DOM 更新到 DOM 想要的状态。 你可以通过使用浏览器工具检查[最后的例子](http://codepen.io/gaearon/pen/gwoJZk?editors=0010)来验证: ![](https://box.kancloud.cn/c158617ed7cc0eac8f58330e49e48224_286x456.gif) 即使我们创建了一个元素在每个 tick 描述整个 UI 树,但是只有文本节点的内容被通过 ReactDOM 进行了更新修改。 在我们的经验中,思考 UI 在某个特定时刻应该是什么外观,而不是思考如何去修改它会消除一整个类型的 bugs 。