Skip to content

类组件 & 函数组件

类组件和函数组件的区别?

类组件:“实例”思维

类组件是面向对象(OOP)的体现。

  • 创建实例:React 会 new 一个组件实例
  • 可变状态:这个实例有自己的生命周期、内部状态和方法。
  • 不稳定的 this:总是需要通过 this 这个可变的指针,来读取 state、props。

心智模型:我们在操作一个长期存在、状态可变的“实例”。

生命周期

类组件关注“时间点”,以生命周期方法为中心,可将逻辑分散到:

  • componentDidMount(挂载时)
  • componentDidUpdate(更新时)
  • componentWillUnmount(卸载时)

这种方式更关注的是“时间点”,这常常导致相关逻辑被拆分到不同的方法中,不易于维护。

类组件在执行 ReactDOM.render(<MyComponent />, document.getElementById("app")) 发生了什么?

js
class MyComponent extends Component {
  render() {
    return <h1>hello</h1>
  }
}
  1. React 解析组件标签,找到 MyComponent 组件。
  2. 发现组件是类定义的,随后 new 出该类示例。并通过该实例调用原型上的 render 方法。
  3. 将 render 返回的虚拟 DOM 转为真实 DOM,随后呈现在页面中。
  • render 是放在哪里的?—— MyComponent 的原型对象上,供示例使用。
  • render 中的 this 是谁?—— MyComponent 的实例对象 | MyComponent 组件实例对象。

函数组件:“快照”思维

函数组件贴近函数式编程(FP)的理念。

  • 重新调用:每次渲染,函数都会被完整地重新执行。
  • 捕获值:每一次渲染都是一个独立的“快照”,函数内部所有的值(state、props)都被固定在了那一刻。
  • hooks 依赖:通过 useState、useEffect 等 hooks 来管理状态和副作用。

心智模型:我们操作的是一次性的渲染函数,它捕获了特定时刻的值。

副作用 useEffect

以 useEffect 为中心,将相关的逻辑组织在一起。

useEffect 的思维模式是:当某些数据(state、props)发生变化时,需要同步执行某些操作。

这种方式它的关注点是“数据”,而不是“时间点”,代码内聚性更强,更易于维护。

拥抱函数组件的理由

  1. React 官方主推的方式,函数组件是未来式。
  2. 代码更简洁:省去了 constructor、this 等冗余代码。
  3. 逻辑复用更优雅:可自定义 hooks,轻松抽离带状态的逻辑。
  4. 心智负担更小:避免 this 指针的困扰,减少类和继承的复杂性。
  5. 行为更可预测:闭包带来的 值捕获特性 让异步操作和副作用处理更符合直觉,减少 bug。

函数组件在执行 ReactDOM.render(<MyComponent />, document.getElementById("app")) 发生了什么?

js
function MyComponent() {
  return <h1>hello</h1>
}
  1. React 解析组件标签,找到 MyComponent 组件。
  2. 发现组件是函数定义的,随后调用该函数。
  3. 将返回的虚拟 DOM 转为真实 DOM,随后呈现在页面中。
  • 函数中 this 是谁?—— 开启严格模式,故而不是 window 而是 undefined。

基于 MIT 许可发布