随着React中hooks的引入,现在主要的困惑是何时使用带有钩子和类组件的函数组件,因为在钩子的帮助下,即使在函数组件中也可以得到state
和部分lifecycle hooks
.所以,我有以下问题
- 钩子的真正优点是什么?
- 什么时候使用带有钩子的函数组件和类组件?
例如,带有钩子的函数组件不能像类组件那样帮助实现性能.他们不能跳过重新渲染,因为他们没有实现shouldComponentUpdate
个.还有其他原因吗?
提前谢谢.
随着React中hooks的引入,现在主要的困惑是何时使用带有钩子和类组件的函数组件,因为在钩子的帮助下,即使在函数组件中也可以得到state
和部分lifecycle hooks
.所以,我有以下问题
例如,带有钩子的函数组件不能像类组件那样帮助实现性能.他们不能跳过重新渲染,因为他们没有实现shouldComponentUpdate
个.还有其他原因吗?
提前谢谢.
引入Hooks
以及React.memo
和React.lazy
等其他功能的 idea 是帮助减少必须编写的代码,并将类似的操作聚合在一起.
文档中提到了使用钩子而不是类的几个真正好的理由
It’s hard to reuse stateful logic between components通常,当你使用HOC或renderProps时,当你试图在DevTools中看到它时,你必须用多个层次 struct 来重新构造你的应用,钩子可以避免这种情况,并帮助你编写更清晰的代码
Complex components become hard to understand通常与类相互不相关的代码通常会一起结束,或者相关的代码往往会被拆分,维护变得越来越困难.这种情况的一个例子是事件侦听器,在componentDidMount
中添加侦听器,在componentWillUnmount
中删除它们.钩子可以让你把这两者结合起来
Classes confuse both people and machines对于类,您需要了解绑定和调用函数的上下文,这通常会造成混淆.
带有钩子的函数组件在perf as类中没有帮助
通过使用React.memo
,函数组件可以以与类React.PureComponent
类似的方式进行记忆,并且可以将比较器函数作为第二个参数传递给React.memo
,从而实现自定义比较器
我们的 idea 是,在Hooks
和其他实用程序的帮助下,能够使用React class component和function component编写代码.钩子可以覆盖类的所有用例,同时在提取、测试和重用代码方面提供更大的灵活性.
由于钩子还没有完全发布,建议不要对关键组件使用钩子,从相对较小的组件开始,是的,您可以用功能组件完全替换类
然而,有一个原因是,在数据获取悬念结束之前,仍然应该使用类组件,而不是带有挂钩的函数组件.使用useEffect挂钩获取数据不像使用生命周期方法那样直观.
另外@DanAbramov在他的一条推文中提到,钩子设计用于悬念,在悬念消失之前,最好使用类