클래스 컴포넌트를 사용하지 않고도 상태와 라이프사이클 메서드 활용 가능
Hooks 자체는 디자인 패턴이라고 할 수 없으나 많은 전통적 디자인 패턴 대체 가능
클래스 컴포넌트의 특징
componentDidMount, componentWillUnmount 등 라이프사이클 메서드 사용하지만 함수형 컴포넌트를 클래스 컴포넌트로 리팩토링할 경우?
여러 컴포넌트 간 코드 공유는 보통 다음 두 패턴 사용
하지만 이런 패턴을 적용하거나 변경하려면?
클래스 컴포넌트에 로직이 많아질수록?
위 문제를 해결하기 위해 React 16.8부터 Hooks 도입
리액트 훅을 사용하면?
useState)useEffect)useStateimport { useState } from 'react'로 리액트에서 불러와야 함useState는 초기 상태값(initial state) 을 인자로 받음const [state, setState] = useState(initialValue);state: 현재 상태 값 → 클래스 컴포넌트의 this.state.value와 유사setState: 상태를 업데이트하는 함수 → this.setState()와 유사useEffectuseEffect는 컴포넌트의 라이프사이클 메서드를 대체할 수 있는 HookcomponentDidMount, componentDidUpdate, componentWillUnmount를 하나로 통합하여 처리할 수 있음| 라이프사이클 메서드 (클래스형) | useEffect 사용 방식 (함수형) | 설명 |
|---|---|---|
componentDidMount | useEffect(() => { ... }, []) | 컴포넌트 마운트 시 1회 실행 |
componentWillUnmount | useEffect(() => { return () => { ... } }, []) | 컴포넌트 언마운트 시 실행 |
componentDidUpdate | useEffect(() => { ... }, [deps]) | 지정한 deps 변경 시마다 실행 |
use로 시작하는 이름으로 함수 작성 (리액트가 규칙 준수 여부 판단)useStateconst [state, setState] = useState(initialValue) 형태useEffectcomponentDidMount, componentDidUpdate, componentWillUnmount 대체useContextuseReducerconst [state, dispatch] = useReducer(reducer, initialState)use로 시작할 것 : Linter(ESLint + React Hooks plugin)로 규칙 위반 감지 가능useEffect, useCallback, useMemo는 잘못 사용 시 성능 문제 유발