Skip to content

React 函数组件和类组件的区别。


1. 基本定义

  • 函数组件:就是一个 JavaScript 函数,接收 props 作为参数,返回 JSX。
  • 类组件:是一个 JavaScript 类,继承自 React.Component,必须实现 render 方法,返回 JSX。

2. 代码结构对比

函数组件

jsx
function MyComponent(props) {
  return <div>Hello, {props.name}!</div>;
}

类组件

jsx
class MyComponent extends React.Component {
  render() {
    return <div>Hello, {this.props.name}!</div>;
  }
}

3. 核心区别

(1) 状态管理

  • 函数组件

    • 以前没有状态管理能力,只能通过 props 接收数据。
    • 现在有了 Hooks(如 useState),可以管理状态。
    • 示例:
      jsx
      function MyComponent() {
        const [count, setCount] = useState(0);
        return (
          <div>
            <p>Count: {count}</p>
            <button onClick={() => setCount(count + 1)}>Increment</button>
          </div>
        );
      }
  • 类组件

    • 通过 this.state 管理状态。
    • 使用 this.setState 更新状态。
    • 示例:
      jsx
      class MyComponent extends React.Component {
        constructor(props) {
          super(props);
          this.state = { count: 0 };
        }
      
        render() {
          return (
            <div>
              <p>Count: {this.state.count}</p>
              <button onClick={() => this.setState({ count: this.state.count + 1 })}>
                Increment
              </button>
            </div>
          );
        }
      }

(2) 生命周期

  • 函数组件

    • 以前没有生命周期方法。
    • 现在通过 Hooks(如 useEffect)模拟生命周期。
    • 示例:
      jsx
      function MyComponent() {
        useEffect(() => {
          console.log('Component mounted or updated');
          return () => {
            console.log('Component will unmount');
          };
        }, []); // 空数组表示只在组件挂载和卸载时执行
        return <div>Hello, World!</div>;
      }
  • 类组件

    • 有完整的生命周期方法,如 componentDidMountcomponentDidUpdatecomponentWillUnmount
    • 示例:
      jsx
      class MyComponent extends React.Component {
        componentDidMount() {
          console.log('Component mounted');
        }
      
        componentDidUpdate() {
          console.log('Component updated');
        }
      
        componentWillUnmount() {
          console.log('Component will unmount');
        }
      
        render() {
          return <div>Hello, World!</div>;
        }
      }

(3) this 绑定

  • 函数组件

    • 没有 this,直接使用变量和函数。
    • 示例:
      jsx
      function MyComponent() {
        const handleClick = () => {
          console.log('Button clicked');
        };
        return <button onClick={handleClick}>Click Me</button>;
      }
  • 类组件

    • 需要处理 this 绑定问题。
    • 示例:
      jsx
      class MyComponent extends React.Component {
        constructor(props) {
          super(props);
          this.handleClick = this.handleClick.bind(this);
        }
      
        handleClick() {
          console.log('Button clicked');
        }
      
        render() {
          return <button onClick={this.handleClick}>Click Me</button>;
        }
      }

(4) 代码简洁性

  • 函数组件

    • 代码更简洁,逻辑更清晰。
    • 适合小型组件或逻辑简单的场景。
  • 类组件

    • 代码相对冗长,尤其是需要处理 this 绑定和生命周期方法时。
    • 适合复杂组件或需要精细控制生命周期的场景。

(5) 性能

  • 函数组件

    • 通常性能更好,因为函数组件更轻量。
    • 通过 React.memo 可以进一步优化性能。
  • 类组件

    • 性能稍差,因为类组件需要实例化,且生命周期方法可能引入额外开销。

4. 如何选择?

  • 使用函数组件

    • 大多数情况下,优先使用函数组件。
    • 逻辑简单、状态少、不需要复杂生命周期的场景。
    • 使用 Hooks 可以覆盖大部分需求。
  • 使用类组件

    • 需要精细控制生命周期的场景。
    • 旧项目维护,或者团队习惯使用类组件。

5. 总结

特性函数组件类组件
状态管理使用 useState使用 this.statethis.setState
生命周期使用 useEffect使用生命周期方法(如 componentDidMount
this 绑定this,直接使用变量和函数需要处理 this 绑定
代码简洁性更简洁相对冗长
性能更轻量,性能更好稍差

6. 趋势

  • 函数组件 + Hooks 是 React 的未来,官方推荐优先使用。
  • 类组件仍然有用,尤其是在维护旧代码时。