
지금은 거의 모든 리액트 강의에서 리액트 코드를 작성할 때 함수형 컴포넌트로 구현한다.
이는 React에서 더이상 클래스형 컴포넌트가 아닌 함수형 컴포넌트를 권장하기 때문이다.
오늘은 이 둘의 어떤 차이가 있었고 기존에 클래스 컴포넌트에서는 어떠한 문제점이 있었길래
함수형 컴포넌트로 대체가 되는 흐름으로 바뀌었는지 알아볼 예정이다.
아래는 기존 클래스형 컴포넌트의 예시 코드이다.
import React, { Component } from 'react';
class ClassComponent extends Component {
constructor(props) {
super(props);
this.state = {
count: 0,
};
// this 바인딩
this.increment = this.increment.bind(this);
}
increment() {
this.setState((prevState) => ({
count: prevState.count + 1,
}));
}
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.increment}>Increment</button>
</div>
);
}
}
export default ClassComponent;
위 코드에서 보여주는 클래스형 컴포넌트의 단점은 다음과 같다.
함수형 컴포넌트는 리액트 16.8 버전부터 도입된 Hooks를 활용하여 컴포넌트에서 클래스에서 메소드를 정의해 사용했던 상태와 생명주기 기능을 사용할 수 있게 되었고 이를 통해 개발자는 더욱 간결하고 효율적인 코드를 작성할 수 있게 되었다.
import React, { useState } from 'react';
const FunctionComponent = () => {
const [count, setCount] = useState(0); // 상태 선언
const increment = () => {
setCount(prevCount => prevCount + 1); // 상태 업데이트
};
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
);
};
const useCounter = () => {
const [count, setCount] = useState(0);
const increment = () => setCount(prevCount => prevCount + 1);
return { count, increment };
};
const ComponentA = () => {
const { count, increment } = useCounter();
return <div onClick={increment}>Count A: {count}</div>;
};
const ComponentB = () => {
const { count, increment } = useCounter();
return <div onClick={increment}>Count B: {count}</div>;
};
이러한 이유들로 인해 리액트 자체에서도 더이상 클래스형 컴포넌트보다는 함수형 컴포넌트의 Hooks로의 전환을 적극적으로 권장하고 있다. 함수형 컴포넌트의 코드가 더 간결하고 가독성이 높으며, 복잡한 상태 관리나 생명주기 처리 또한 더욱 쉽게 짤 수 있기 떄문이다.