React Hooks 还不如类?

本文最初发布于Medium网站,经原作者授权由InfoQ中文站翻译并分享。

在这篇文章中,作者按照官方文档的描述,分析用 React Hooks 代替类的动机,一如标题所示,作者并不是很喜欢这一特性。

动机1:类令人困惑

我们发现,类可能是学习React道路上的一大障碍。你必须了解this在JavaScript中的工作机制,这和大多数语言中的机制截然不同。你必须记得绑定事件处理程序。没有不稳定的语法提案,代码就非常冗长,React中函数和类组件之间的区别,以及何时该使用哪一个的话题,即便在经验丰富的React开发人员之间也存在分歧。

好的,我同意当你刚开始使用Javascript时,this可能会有些令人头疼,但是箭头函数解决了这种困惑;而且调用一个Typescript已经开箱支持的阶段3特性都被称作是“不稳定的语法提案”,这就纯粹是耸人听闻。React团队指的是类字段语法,这种语法已经被广泛使用并且可能很快就会得到正式支持:

class Foo extends React.Component {
  onPress = () => {
    console.log(this.props.someProp);
  }
  render() {
    return <Button onPress={this.onPress} />
  }
}

如你所见,使用类字段箭头函数时,你无需在构造函数中绑定任何内容,并且this始终指向正确的上下文。

如果类是令人困惑的,那么新的hooked函数又能强到哪儿去呢?一个hooked函数并不是一个常规函数,因为它具有状态,有一个看上去很奇怪的this(也就是useRef),并且可以具有多个实例。但它绝对不是类,而是介于两者之间,后文我都会叫它Funclass。那么,对于人类和机器而言,那些Funclass理解起来会更容易吗?机器这边我不确定,但我真的不认为Funclass从概念上来讲比类更容易理解。类是一个广为人知且经过深思熟虑的概念,每位开发人员都熟悉this的概念,就算在javascript中有所不同也不是大事。相比之下,Funclass是一个新概念,一个很奇怪的概念。它们更像是魔法,而且过多地依赖约定而不是严格的语法。你必须遵循一些严格而怪异的规则,需要注意代码放置的位置,并且这里面存在许多陷阱。我不能将一个hook放在一个if语句中,因为hooks的内部机制是基于调用顺序的,这简直太疯狂了!这种事情更像是半吊子的POC库会做出来的,而不是像React这样的知名库中应该做的。而且我们还要准备好接受一些可怕的名称,例如useRef(this的一个花哨的叫法)、useEffect、useMemo、useImperativeHandle(这啥?)等等。

原文链接:【https://www.infoq.cn/article/ltgmCtDsuts31qM1W20D】。未经作者许可,禁止转载。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章