Angular 5.0 变化检测策略 VS React 的变化检测策略



我了解更改检测Angular 5.0中的工作原理。

有人能帮助我理解这在React中是如何工作的吗?它与Angular的有多大不同?

React和Angular的更改检测是不同的,但它们有一个共同的非常重要的东西——从内存(而不是从DOM)中区分当前和以前的状态,并只呈现更改后的状态。

在Angular中,在高级别上,它的工作方式如下:

  1. 更改检测由区域中每个调用堆栈末尾的zone.js触发。u2028这意味着在执行对每个异步操作(点击、http请求、超时)的回调之后,将触发更改检测。u2028您也可以手动触发更改检测,甚至"关闭"zone.js,但让我们坚持使用最常见的场景
  2. 更改检测从根组件开始,并通过组件树向下进行(同样,您可以在任何组件上手动触发它,但这不是最常见的情况)
  3. 它遍历组件树,检查组件模板中哪些值需要更新,并更新DOM

注意:请注意,如果使用ChangeDetectionStrategy.OnPush,某些组件及其后代可能在树遍历期间被省略。这可能是一个很好的优化。

在React中,它看起来像这样:

  1. 异步操作回调后不会触发更改检测。它是通过调用组件上的方法setState来触发的
  2. 变化检测不是从根组件开始的,而是从调用setState的组件开始的
  3. 协调阶段开始了——遍历组件及其子体,以检查哪些值需要在真实DOM中更新。因此,从概念上讲,这一点与Angular非常相似。然而,在React 16中,它有点复杂。检查一下
  4. 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使用模板中使用的数据绑定值,前后进行比较)

相关内容

  • 没有找到相关文章

最新更新