1)组件之间的状态逻辑很难复用。React不提供将可重用行为“附加”到组件的方法(例如,将组件连接到商店)。要解决此类问题,您可以使用渲染道具和高级类组件。但是这样的方案需要重新组织组件结构,这会很麻烦并且使代码难以理解。由提供者、消费者、高阶组件、渲染道具和其他抽象层组成的组件形成了一个“嵌套地狱”。虽然可以在DevTools中过滤掉它们,但这说明了一个更深层次的问题:React需要一种更好的原生方式来共享状态逻辑。钩子可用于从组件中提取状态逻辑,以便可以单独测试和重用这些逻辑。钩子允许我们在不修改组件结构的情况下重用状态逻辑。这使得在组件之间或社区内共享Hook变得更加容易。2)复杂的组件变得难以理解在组件中,每个生命周期往往包含一些不相关的逻辑。例如,组件经常在componentDidMount和componentDidUpdate中获取数据。但是同样的componentDidMount可能还包含很多其他的逻辑,比如设置事件监听,这些需要后面在componentWillUnmount中清除。相关且需要相互修改的代码被拆分,而完全不相关的代码被组合在同一个方法中。这很容易导致错误和逻辑不一致。在大多数情况下,不可能将组件分解成更小的粒度,因为状态逻辑无处不在。这也给测试带来了一些挑战。同时,这也是很多人使用带有状态管理库的React的原因之一。然而,这通常会引入很多抽象,需要您在不同的文件之间来回切换,使重用变得更加困难。为了解决这个问题,Hook将组件中相互关联的部分拆分为更小的功能(例如设置订阅或请求数据),而不是强制执行生命周期划分。您还可以使用reducer来管理组件的内部状态,使其更具可预测性。3)看不懂的class除了代码重用和代码管理困难之外,class是学习React的一大障碍。我们必须了解这在JavaScript中是如何工作的,它与其他语言有很大不同。也不要忘记绑定事件处理程序。没有一个稳定的语法提议,这些代码是非常冗余的。props、state、top-down数据流大家都能很好的理解,但是对于class却无能为力。即使是经验丰富的React开发者,对于函数组件和类组件的区别,甚至这两个组件的使用场景,也存在分歧。为了解决这些问题,Hooks允许你在没有类的情况下使用更多的React特性。从概念上讲,React组件一直更像是函数。另一方面,Hooks在不牺牲React精神原则的情况下拥抱功能。钩子提供问题的解决方案,而无需学习复杂的函数式或反应式编程技术
