Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《JavaScript教程》
    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《JavaScript教程》
    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • react基础

    • React重要阶段的特性
    • Vue3 → React18对照学习表
    • class和hooks选哪个好
      • 一、从官方和生态的现实说
        • 1️⃣ 官方态度已经很明确
        • 2️⃣ 生态现状
      • 二、从“写代码体验”和“可维护性”讲
        • 1️⃣ 同样的逻辑,对比一下
        • Class
        • Hooks
        • 2️⃣ 逻辑复用:Hooks 完胜
        • Class 的复用方式(历史)
        • Hooks
      • 三、从 React 内部原理看
        • 1️⃣ Hooks 和 Fiber 是“原生绑定”的
        • 2️⃣ Class 本质上是“外层封装”
      • 四、那 Class 还有没有“更好”的场景?
        • ✅ 适合用 Class 的情况
        • ❌ 不适合再用 Class 的情况
      • 五、一句工程师视角的结论
  • react原理

  • react全家桶

  • 《React18》学习笔记
  • react基础
mamingjuan
2025-08-26
目录

class和hooks选哪个好

短结论先给你:

  • 现在(React 16.8+)👉 几乎所有新项目:选 Hooks
  • Class 主要是“历史遗产 + 维护旧代码”

# 一、从官方和生态的现实说

# 1️⃣ 官方态度已经很明确

  • 新特性只围绕 Hooks 设计

    • useState / useEffect / useTransition / useSyncExternalStore
    • Server Components、Concurrent Features
  • Class 没有被废弃,但不会再增强

  • React 团队原话核心意思:
  • Class 是兼容层,Hooks 是未来

# 2️⃣ 生态现状

  • 新库几乎只提供 Hooks API

    • React Query
    • Zustand / Jotai / Redux Toolkit
    • Framer Motion
  • 教程、示例、最佳实践:99% 是 Hooks

👉 用 Class 会让你脱离主流生态


# 二、从“写代码体验”和“可维护性”讲

# 1️⃣ 同样的逻辑,对比一下

# Class

class Counter extends React.Component {
  state = { count: 0 }

  componentDidMount() {
    document.title = this.state.count
  }

  componentDidUpdate() {
    document.title = this.state.count
  }

  render() {
    return (
      <button onClick={() => this.setState({ count: this.state.count + 1 })}>
        {this.state.count}
      </button>
    )
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# Hooks

function Counter() {
  const [count, setCount] = useState(0)

  useEffect(() => {
    document.title = count
  }, [count])

  return (
    <button onClick={() => setCount(c => c + 1)}>
      {count}
    </button>
  )
}
1
2
3
4
5
6
7
8
9
10
11
12
13

👉 Hooks 的优势不只是“短”,而是:

  • 逻辑按“功能”聚合
  • 不再分散在 componentDidMount / Update / WillUnmount
  • 没有 this
  • 不需要手动绑定上下文

# 2️⃣ 逻辑复用:Hooks 完胜

# Class 的复用方式(历史)

  • HOC(嵌套地狱)
  • Render Props(JSX 套娃)

# Hooks

function useTitle(title) {
  useEffect(() => {
    document.title = title
  }, [title])
}
1
2
3
4
5

自定义 Hook = 逻辑层面的“函数抽象”

这是 Class 永远做不到的事情。


# 三、从 React 内部原理看

  • Fiber
  • renderWithHooks
  • Hooks Dispatcher
  • 为什么 hooks 不能写在条件里

👉 这正是关键点。

# 1️⃣ Hooks 和 Fiber 是“原生绑定”的

  • 每个 Function Component 对应一个 Fiber

  • Hooks 存在 Fiber.memoizedState 的链表上

  • renderWithHooks 在渲染时:

    • 设置 Dispatcher(mount / update)
    • 顺序读取 hooks

👉 Hooks 是 React 新架构的“一等公民”


# 2️⃣ Class 本质上是“外层封装”

  • this.state、this.setState
  • 生命周期方法
  • 都是在 Fiber 上模拟出来的

可以理解为:

  • Class = 旧 API,跑在新内核之上
  • Hooks = 直接使用新内核

# 四、那 Class 还有没有“更好”的场景?

有,但很少 👇

# ✅ 适合用 Class 的情况

  1. 维护老项目
  2. 代码库已经是 Class 风格,没计划重构
  3. 需要 componentDidCatch(但现在 Hooks 也有替代方案)

# ❌ 不适合再用 Class 的情况

  • 新项目
  • 新组件
  • 想学习 React 原理 / 并发特性
  • 想跟主流生态

# 五、一句工程师视角的结论

  • Class 是“如何使用 React”
  • Hooks 是“如何思考 React”

如果你问的是:

  • 面试 👉 Hooks
  • 实际开发 👉 Hooks
  • 深入源码 / Fiber / Scheduler 👉 必须 Hooks
  • 接手老代码 👉 懂 Class 即可,不必新写
上次更新: 2026/01/09, 03:15:08
Vue3 → React18对照学习表
Vue3 effect vs react hooks

← Vue3 → React18对照学习表 Vue3 effect vs react hooks→

Copyright © 2015-2026 Glitz Ma
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式