React hooks之痛:低效的变化传播

最近看到如何去合理使用 React hook? - Parabola的回答 - 知乎 。作者将React hooks的模型类比于rxjs的模型,比如rxjs的merge操作,在React的世界中可以这样实现:
image.png

它们确实可以理解成等价的。它们都是对数据计算关系的定义,输入2个数据流,输出1个数据流。

乍一看很有道理,但是越想越不对劲。真的可以使用hook来模仿rxjs响应式编程吗?

不能。React hooks有一个致命的缺陷:数据变化每传播一步就需要等待1轮渲染。如果通过hook来定义计算关系,那么变化的传播会非常低效。

举个例子,原回答是这样实现distinctUntilChanged的:
image.png

它们也确实可以理解成等价的,让我们用hooks写一个数据关系定义:

function useMyData(a) {  
  return useDistinctUntilChanged(
           useDistinctUntilChanged(
             useDistinctUntilChanged(a)));  
}

我们会发现,a变化以后,它的输出要经历3次重新渲染才能传播到useMyData的调用者(useMyData的调用者这个时候才会感知到数据变化)。这是非常低效的变化传播。

这个例子虽然比较极端,但是如果通过hook来定义计算关系,那么这种情况其实会经常出现。在我看来,目前React hooks并不擅长定义数据计算关系。

你可能感兴趣的:(javascript,前端,react.js)