React - class组件和函数组件的比较

1,577 阅读2分钟

class组件 和 函数组件

无生命周期函数,不需要访问this,代码更简洁

class组件:

  • 需要写很多周期函数,而且需要通过this来访问自定义事件和一些实例的api

函数组件:

  • 不需要写生命周期函数和this

组件之间很难复用状态逻辑

class组件:

  • React 没有提供将可复用性行为“附加”到组件的途径。

  • class组件中可以通过Provider, Consumer, render props高阶组件来实现状态逻辑复用,需要重新组织组件结构,形成组件和代码的嵌套,使代码难以理解。

函数组件:

  • Hook 使你在无需修改组件结构的情况下复用状态逻辑。

复杂组件更容易理解

class组件:

  • class组件逐渐会被状态逻辑和副作用充斥。每个生命周期常常包含一些不相关的逻辑。例如,组件常常在 componentDidMount 和 componentDidUpdate 中获取数据。但是,同一个 componentDidMount 中可能也包含很多其它的逻辑,如设置事件监听,而之后需在 componentWillUnmount 中清除。

  • 相互关联且需要对照修改的代码被进行了拆分,而完全不相关的代码却在同一个方法中组合在一起。如此很容易产生 bug,并且导致逻辑不一致。

  • 不可能将组建拆分到更小的颗粒度,因为状态逻辑无处不在。不利于单元测试。

函数组件:

  • Hook 将组件中相互关联的部分拆分成更小的函数(比如设置订阅或请求数据),而并非强制按照生命周期划分。你还可以使用 reducer 来管理组件的内部状态,使其更加可预测。

更符合react哲学

image.png

class组件:

  • 子组件中props和state会随着this的改变取到的内容可能不是子组件想用的内容,需要通过一次解构,将this.props或者this.state的值存下来,这样才能保证此次要渲染的内容无误。

  • 因为props本身不会改变,所以对于函数组件来说,取到的props不会随着this的改变而改变。

函数组件:

  • 函数式组件获取了render所需要的值。

  • React设计理念就是,UI 在概念上就是当前应用状态的一个渲染函数,我们的事件处理程序(render) 本质上就是一个拥有特定 props 和 state 的特定渲染。