【发布时间】:2019-02-26 20:02:31
【问题描述】:
在React tutorial ,上面写着
React 元素是不可变的。一旦你创建了一个元素,你就不能改变它的子元素或属性。元素就像电影中的单个帧:它代表某个时间点的 UI。 根据我们目前的知识,更新 UI 的唯一方法是创建一个新元素并将其传递给 ReactDOM.render()。
在下一个标题中,它说
React 只更新什么是必要的
React DOM 将元素及其子元素与前一个元素进行比较,并且仅应用必要的 DOM 更新以使 DOM 达到所需状态。
他们的例子-
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);
在这个例子中,React 只更新时间 - <h2>It is {new Date().toLocaleTimeString()}.</h2> 代码行。因为这只是必要的更改,但我无法理解 React 如何更改 Immutable 对象,因为他们提到了
React 元素是不可变的。创建元素后,您无法更改其子元素或属性。
因此,与其只更改“Just Time Part”(上述代码示例),还应更改整个 React 元素。 我无法理解 React 如何在 Immutable 对象内进行必要的更新(在上面的情况下它是元素)或者我错过了什么?
【问题讨论】:
-
元素确实是不可变的。 React 并没有改变它,它把所有的东西都扔掉了,制作了一个全新的版本。 (
element仅在tick函数的范围内,一旦它运行,每秒,element将被垃圾收集)。当然这是非常低效的,所以如果你继续阅读文档,你会看到它继续到 React “组件”,它们是可变的,并且会自动选择性地更新自己以响应某些触发器。据我所知,“现实世界”的 React 应用程序只使用组件,而不是“元素”。 -
@RobinZigmond “全新版本”是什么意思?新版本是否仅表示包含时间的行(
它是 {new Date().toLocaleTimeString()})。是的,我认为这是真的——“元素”将被垃圾收集。不,我还没有通过组件,我会阅读。
-
@JoshiYogesh - 我现在真的很困惑,哈哈。 (不久前我自学了 React,我几乎不是专家或任何东西。)我实际上的意思是整个元素被“扔掉”(垃圾收集”,并制作了一个新元素 - 我'就
element,JS对象而言,我仍然很确定这是正确的。但是经过更多思考(包括阅读下面的答案)我确实认为React只会在更新DOM本身时改变最小的必要部分。从 JS 的角度来看,这并没有改变元素是不可变的事实。
标签: javascript reactjs