React Hooks三连问:有什么用,为什么有Hooks,跟传统面向对象的区别

14 阅读3分钟

一、React Hooks 到底有什么用?

Hooks 让你在「函数组件」里,也能使用 React 的核心功能(state、生命周期、副作用、共享逻辑)。

在 Hooks 出现之前:

  • 函数组件 = 只能渲染 UI,不能存状态、不能写生命周期
  • 想写复杂逻辑 → 必须用类组件(Class)

Hooks 解决的就是:让函数组件也能写完整的业务逻辑,替代类组件

最常用的 4 个 Hooks

  1. useState → 给函数组件加状态(state)
  2. useEffect → 处理副作用(请求接口、定时器、DOM 操作)
  3. useContext → 方便拿跨组件共享数据
  4. useRef → 拿 DOM 元素 / 存不渲染的数据

二、为什么要用 Hooks?(核心优势)

1. 代码更简洁、更易读

Class 写法要写 constructorthisbind,代码臃肿。Hooks 直接一行声明状态,逻辑更直观。

2. 告别烦人的 this

Class 组件最大的坑就是 this 指向问题,Hooks 完全不用 this

3. 逻辑可以复用(优点)

以前复用逻辑只能用:

  • 高阶组件 HOC
  • Render Props会导致组件嵌套地狱

Hooks 可以把独立逻辑抽成自定义 Hook,像函数一样复用,无嵌套、干净。

4. 逻辑聚合,更好维护

Class 里:一个业务逻辑会拆在 componentDidMountcomponentDidUpdatecomponentWillUnmount 里。Hooks:一个业务逻辑写在一起,可读性爆炸提升。

5. 更好的编译优化

函数组件比类组件更容易被 React 编译优化。


三、Hooks 写法 vs 传统面向对象(Class)写法

同功能对比,一眼看出区别。

需求:一个计数器

1. 传统 Class 写法(面向对象)

import React from 'react'; 
class Counter extends React.Component {
    constructor(props) {
        super(props);
        this.state = { count: 0 }; // 声明状态
    }
    
    componentDidMount() {
        console.log('挂载');
    }
    
    componentDidUpdate() {
        console.log('更新');
    }
    
    componentWillUnmount() {
        console.log('销毁');
    }
    
    add = () => {
        this.setState({ count: this.state.count + 1 });
    };
    
    render() {
        return (
            <div>
                <p>{this.state.count}</p>
                <button onClick={this.add}> +1 </button>
            </div>
        );
    }
}

2. Hooks 写法(函数式)

import React, { useState, useEffect } from 'react';

const Counter = () => {
    // 声明状态
    const [count, setCount] = useState(0);
    
    // 生命周期 + 副作用 合一 
    useEffect(() => {
        console.log('挂载/更新');
        return () => console.log('销毁');
    });
    
    return (
        <div>
            <p>{count}</p>
            <button onClick={() => setCount(count + 1)}>+1</button>
        </div>
    );
};

四、核心区别(面试必记)

1. 编程范式不同

  • Class:面向对象编程(OOP)

    • 继承、实例、this、生命周期方法
  • Hooks:函数式编程(FP)

    • 纯函数、无状态、组合式、无 this

2. 状态管理方式不同

  • Class:this.state + this.setState()
  • Hooks:useState 直接返回状态和修改函数

3. 生命周期 vs 副作用

  • Class:生命周期函数(固定名字)
  • Hooks:useEffect 统一管理(更灵活)

4. 逻辑复用

  • Class:HOC / Render Props(嵌套地狱)
  • Hooks:自定义 Hooks(干净、自由、无嵌套)

5. 代码体积 & 可读性

  • Class:代码冗余、this 易出错
  • Hooks:精简、直观、易维护

6. 组件设计思想

  • Class:以类实例为核心
  • Hooks:以逻辑函数为核心

五、总之(面试记这个就够)

  1. Hooks 作用:让函数组件拥有 state、生命周期、副作用。

  2. 为什么用:代码简洁、无 this、逻辑易复用、易维护。

  3. 与 Class 区别

    • Class:面向对象、有 this、生命周期分散、复用麻烦
    • Hooks:函数式、无 this、逻辑聚合、复用自由、代码更清爽

参考文章:

# 10分钟了解react引入的hooks

# 【Hooks系列1】React中为什么会有Hooks,它有什么用?

# 一文彻底搞懂react hooks的原理和实现

# 浅谈:为啥vue和react都选择了Hooks🏂?