React 元素是不可变对象。一旦被创建,你就无法更改它的子元素或者属性。一个元素就像电影的单帧:它代表了某个特定时刻的 UI。
根据我们已有的知识,更新 UI 唯一的方式是创建一个全新的元素,并将其传入ReactDOM.render()
。
考虑一个计时器的例子:
<!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>
<script src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
<!-- <script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script> -->
<!-- <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script> -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function click() {
var element = (
<p>当前时间:{new Date().toLocaleTimeString()}</p>
)
ReactDOM.render(element, document.getElementById('root'))
}
setInterval(click, 1000)
</script>
</body>
</html>
这个例子会在 setInterval()
回调函数,每秒都调用 ReactDOM.render()
。
注意:browser.min.js
包必须导入,因为浏览器不支持jsx
写法,需要使用babel
转译
React DOM
会将元素和它的子元素与它们之前的状态进行比较,并只会进行必要的更新来使 DOM
达到预期的状态。
尽管每一秒我们都会新建一个描述整个 UI
树的元素,React DOM
只会更新实际改变了的内容,也就是例子中的文本节点。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。