我了解更改检测在Angular 5.0中的工作原理。
有人能帮助我理解这在React中是如何工作的吗?它与Angular的有多大不同?
在Angular中,在高级别上,它的工作方式如下:
- 更改检测由区域中每个调用堆栈末尾的zone.js触发。u2028这意味着在执行对每个异步操作(点击、http请求、超时)的回调之后,将触发更改检测。u2028您也可以手动触发更改检测,甚至"关闭"zone.js,但让我们坚持使用最常见的场景
- 更改检测从根组件开始,并通过组件树向下进行(同样,您可以在任何组件上手动触发它,但这不是最常见的情况)
- 它遍历组件树,检查组件模板中哪些值需要更新,并更新DOM
注意:请注意,如果使用ChangeDetectionStrategy.OnPush,某些组件及其后代可能在树遍历期间被省略。这可能是一个很好的优化。
在React中,它看起来像这样:
- 异步操作回调后不会触发更改检测。它是通过调用组件上的方法setState来触发的
- 变化检测不是从根组件开始的,而是从调用
setState
的组件开始的 - 协调阶段开始了——遍历组件及其子体,以检查哪些值需要在真实DOM中更新。因此,从概念上讲,这一点与Angular非常相似。然而,在React 16中,它有点复杂。检查一下
- Dom已更新
注意:与Angular的ChangeDetectionStrategy.OnPush类似,在React中我们有React.PureComponent类。我们可以使用这个类来避免不必要的更改检测。
当然,还有更多的差异,但在高层,我认为这些是最重要的。
React变化检测或多或少与Angular相同,除了三件事:
1)何时启动:无论何时调用组件的setState方法,都会启动diffing(而无论何时触发Dom事件,无论何时运行setInterval/setTimeout回调,以及无论何时运行ajax回调,Angular都会执行diffing)
2)从哪里开始:困难从调用了setState的组件开始,然后是它的子组件,然后是层次结构(而Angular从最顶部的组件开始)
3)比较内容:diffing将当前HTML的虚拟DOM与状态更改后的虚拟DOM进行比较。(而Angular使用模板中使用的数据绑定值,前后进行比较)