状态管理更加清晰
- 将“状态”与“变更状态的逻辑”两两配对,拥有比原来更好的代码结构。
- 将状态进行更细粒度的拆分,将没有联动关系的状态放到不同的组件中单独管理。
- 将状态的管理与视图的渲染进行隔离,把一个带有复杂的render实现的类组件拆分为一个“单纯管理状态的类组件”和一个“实现渲染逻辑的纯函数组件”。
生命周期的淡化
- 代码可读性更强,原本同一块功能的代码逻辑被拆分在了不同的生命周期函数中,容易使开发者不利于维护和迭代,通过 React Hooks 可以将功能代码聚合,方便阅读维护。
- 例如,每个生命周期中常常会包含一些不相关的逻辑。一般我们都会在 componentDidMount 和 componentDidUpdate 中获取数据。但是,同一个 componentDidMount 中可能也包含很多其它的逻辑,如设置事件监听,而之后需在 componentWillUnmount 中清除。相互关联且需要对照修改的代码被进行了拆分,而完全不相关的代码却在同一个方法中组合在一起。如此很容易产生 bug,并且导致逻辑不一致。
组件树层级变浅
- 在原本的代码中,我们经常使用 HOC/render props 等方式来复用组件的状态,增强功能等,无疑增加了组件树层数及渲染,在 React DevTools 中观察过 React 应用,你会发现由 providers,consumers,高阶组件,render props 等其他抽象层组成的组件会形成“嵌套地狱”。而在 React Hooks 中,这些功能都可以通过强大的自定义的 Hooks 来实现。
不用再去考虑 this 的指向问题
- 在类组件中,你必须去理解 JavaScript 中 this 的工作方式。
状态不同步
- useEffect不是很好用,依赖参数不好写,而且很容易出错,有时会发生比预想更多的调用次数。这绝对可以成为摒弃react hooks的理由。函数的运行是独立的,每个函数都有一份父级作用域。当我们处理复杂逻辑的时候,经常会碰到状态不同步的问题。