本文是我和程序媛_小发在年翻译的ReactConf的主旨演讲的第二部分,由React核心组成员、Redux作者、被尤雨溪评价为“圣人”、外号DemoBoy的DanAbramov带来的ReactHooks提案,ReactConf也阻止不了Dan现场敲代码。Dan用Class组件和Function组件对比的方式展示Hooks的强大功能,现场十分精彩,掌声欢呼频频。也就是那时被Dan圈粉,看了他很多的文章,我后来的技术文风也深受Dan的文章影响。
,如果没耐心看Demo代码,请一定要看最后一段Dan关于ReactHooks的哲学思考。Dan最后从React的Logo说起,将ReactHooks的出现与电子的发现做了类比,升华到了一定高度:“我感觉Hook一直在我们的视线里面隐藏了四年。事实上,如果看看React的Logo,可以看到电子的轨道,而Hook好像一直就在那里”。
ReactHooks给React生态带来了巨大变化,两年多时间,已经有大量最佳实践了,现在我们一起来回顾年这段精彩瞬间:
嗨。我的名字是Dan。我在ReactTeam工作,这是我第一次参加React大会。(掌声)
React当前面临的问题刚才Sophie讲述了这三个问题,我想大多数的开发者在React开发过程中都会遇到这些问题。当然,我们可以逐一来解决这些问题。我们可以尝试独立地去解决这些问题。但是实际上解决其中一个问题可能会使其他问题更加严重。
比如我们尝试解决“包装地狱”问题,可以将更多的逻辑放到组件里面,但是我们的组件会变得更大,而且更难以重构。另一个方面,如果我们为了方便重用,尝试将组件拆分为更小的片段,那么组件树的嵌套会更多了,而且最终又会以“包装地狱”收场。最后,无论那种情况,使用class都会让人产生困惑。
因此我们认为造成这种情况是因为这不是三个独立的问题。我们认为,这是同一个问题的三个症状。问题在于React没有原生提供一个比class组件更简单、更小型、更轻量级的方式来添加state或生命周期。
而且一旦你使用了class组件,你没有办法在不造成“包装地狱”的情况下,进一步拆分它。事实上,这并不是一个新问题。如果你已经使用了React几年,你也许还记得在React刚出来的时候,事实上已经包含了一个针对该问题的解决方案。嗯,这个解决方案就是mixins。Mixins能够让你在class之间复用方法,并且可以减少嵌套。
所以我们要在React里面重新把mixins添加回来吗?(对...不...)对了,不,不,我们不会添加mixins。我的意思是之前使用mixins的代码并不是无法使用了。但是我们不再推荐在React里使用mixins。如果你好奇我们这么做的原因,可以在ReactBlog里面查看我们之前写的一篇文章,题目是《Mixins是有害的》。在文章中,我们从实验结果发现mixins带来的问题远比它解决的问题多。因此,我们不推荐大家使用mixins。
我们有一个提案那么也许我们解决不了这个问题了,因为这是React组件模型固有的问题。也许我们不得不选择接受现实。(笑声)或者也许有另外一种书写组件的方法可以避免这些问题。
这也就是今天我将要分享的内容。
但是在开始分享我们在React上做出的改动和新特性之前,我想先讲讲一年前我们建立的RFC流程,RFC表示requestfor