Chat Conversation

참여자: User, QueryPie

Message 1 from User

What's the difference between React hooks and class components? When should I use each?

Message 2 from QueryPie

React hooks and class components represent two different approaches to building React components, with hooks being the modern preferred method introduced in React 16.8.

Class Components

Class components use ES6 class syntax and extend React.Component. They manage state through this.state and use lifecycle methods like componentDidMount, componentDidUpdate, and componentWillUnmount.

class UserProfile extends React.Component {
  constructor(props) {
    super(props);
    this.state = { user: null, loading: true };
  }

  componentDidMount() {
    this.fetchUser();
  }

  componentDidUpdate(prevProps) {
    if (prevProps.userId !== this.props.userId) {
      this.fetchUser();
    }
  }

  fetchUser = () => {
    // API call logic
  }

  render() {
    return <div>{this.state.loading ? 'Loading...' : this.state.user.name}</div>;
  }
}

React Hooks

Hooks are functions that let you use state and lifecycle features in functional components. The most common are useState for state management and useEffect for side effects.

function UserProfile({ userId }) {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetchUser();
  }, [userId]); // Re-run when userId changes

  const fetchUser = () => {
    // API call logic
  };

  return <div>{loading ? 'Loading...' : user.name}</div>;
}

Key Differences

Aspect Class Components Hooks
Syntax Verbose, requires class boilerplate Concise, functional approach
State Management this.state and this.setState() useState hook
Lifecycle Separate lifecycle methods useEffect handles all side effects
Logic Reuse Higher-order components or render props Custom hooks
Performance Slightly more overhead Generally more optimized
Learning Curve Requires understanding this binding More intuitive for JavaScript developers

When to Use Each

Use Hooks (Recommended):

  • All new React development
  • When building functional, reusable logic
  • For cleaner, more readable code
  • When you want better performance optimization
  • For easier testing and debugging

Use Class Components:

  • Legacy codebases that haven't migrated
  • When working with older React versions (pre-16.8)
  • Specific edge cases requiring error boundaries (though useErrorBoundary hooks exist in libraries)

Migration Considerations

Most class components can be converted to hooks, but some patterns require different approaches:

  • Error boundaries still need class components (unless using third-party hooks)
  • Complex lifecycle logic may need restructuring with multiple useEffect calls
  • this binding issues disappear with hooks

The React team recommends using hooks for all new development while gradually migrating existing class components when convenient. Hooks provide better code organization, easier logic sharing, and improved performance characteristics.