상태 관리가 가능하고 라이프사이클 API를 사용할 수 있는 함수형 컴포넌트
리액트에서 컴포넌트를 정의하는 방법은 두가지가 있다
클래스형 컴포넌트
- state를 가지고 있어 상태 변화에 대한 관리를 할 수 있다
- 단계별로 라이프 사이클을 경험할 수 있고, 라이프 사이클 API를 사용할 수 있다
함수형 컴포넌트
- 클래스형 컴포넌트에 비해 선언하기가 간편하여 주로 화면을 그리는 역할을 한다
- 메모리 자원을 클래스형 컴포넌트 보다는 덜 사용한다
- state와 라이프사이클 API 사용이 불가능 하다
한마디로 클래스형은 stateful component , 함수형은 stateless component라고 할 수 있다
➡ 그러나 리액트 16.8 버전에 추가된 React Hook 으로 클래스형 컴포넌트에만 사용할 수 있었던 state, 라이프사이클 API를 함수형 컴포넌트에서도 사용할 수 있게 됐다
프레젠테이션 컴포넌트 (화면을 그리는 역할에 집중)
과 컨테이너 컴포넌트 (상태, 로직을 가지고 있는 컨테이너)
를 통해 컴포넌트의 재사용을 수월하게 할 수 있다컨테이너 컴포넌트는 상태와 비지니스 로직을 가지고 있기 때문에 이를 재사용하기가 쉽지 않다
render props
그리고 고차 컴포넌트(HOC)
를 사용해야 했다render props : 반복되는 로직을 쉽게 재사용 할 수 있게 해주고, 컴포넌트 코드를 작성하는 과정에서 컴포넌트를 함수로 감싸는 것이 아니라 JSX에서 렌더링 하는 방식으로 사용할 수 있게 해주는 패턴
HOC : 리액트 컴포넌트를 인자로 받아 새로운 리액트 컴포넌트를 반환하는 함수
componentDidMount
그리고 componentDidUpdate
로 데이터를 가져오는 것을 수행할 수 있다.componentDidMount
메서드라도 이벤트 리스너를 설정하는 것과 같은 관계없는 일부 로직이 포함될 수도 있고, componentWillUnmont
에서 cleanup
을 수행하기도 한다Hook은 로직을 기반을 둔 작은 함수로 컴포넌트를 나눌 수 있다
componentDidMount
나 componentDidUpdate
로 데이터를 가져올 때 handleMainData
가 반복된다 handleMainData = () => {
fetch(
`http://'API주소'/category?category=${this.state.currentCate}`
)
.then((res) => res.json())
.then((res) => this.setState({ category: res }));
};
componentDidMount() {
this.handleMainData();
}
componentDidUpdate(prevProps) {
if (prevProps.match.params.slug !== this.props.match.params.slug) {
this.handleMainData();
}
}
Hook은 상태 관련 로직을 추상화 할 수 있어 재사용이 가능하다
this
때문이다.this
를 바인딩 해주어야 하는데, 이는 실수를 유발하고 코드가 장황해질 수 있다는 문제점을 가진다Hook
은 함수형 컴포넌트 이므로 함수 안에서 다른 함수를 호출하는 것으로 새로운 Hook
을 만들어 볼 수 있기 때문이다Hook
과 다른 사람들이 만든 여러 custom Hook
을 레고처럼 조립해서 쉽게 custom Hook
을 만들수 있다Hook
은 같은 로직을 한 곳으로 모을 수 있다