React 16.8 version부터 새로 도입된 hooks는 기존 리액트 개발 환경에서 큰 변화를 주었다.
대표적으로 class와 함수형을 혼용하여 코드를 구성했던 컴포넌트에서 함수형만으로
리액트 컴포넌트를 관리할 수 있게 만들었다.
React를 통해 AJAX 요청 혹은 타 데이터 API를 사용할 경우 발생하는
Side Effect를 다루기 위해 Hooks를 사용할 수 있다.
또한 상태 변화 관리를 보다 직관적으로 표현할 수 있다.
위 장점들이 얼마나 크게 부각되는지 useState
, useEffect
의 두 가지 Basic Hooks를 통해 설명하겠다.
state는 상태가 변화하는 값을 의미 한다.
useState
let [state 저장 변수, state 갱신 함수] = useState(상태 초기값)
문법은 위의 형식으로 이루어져 있으며, useState의 작동을 알 수 있도록 코드를 구성해 보았다.
App 함수는 부모 컴포넌트에 해당되며 반대로 List 함수는 자식 컴포넌트이다.
App 함수의 상단 부분에 useState을 생성한 것을 볼 수가 있다.
이제 useState가 어떤 상태 변화를 부여하는지 메커니즘 순서를 알아보자.
input
입력창에 아무 문구를 입력하면 inputList
함수가 실행된다.inputList
함수 본문의 useState 갱신 함수 setNewTodo
가 작성한 문구를 갱신한다.newTodo
저장 변수에 담게 된다. (상태 변화 발생) addTodo
함수가 실행된다.addTodo
함수 본문에는 useState 갱신 함수 setTodos
가 기존 배열에 새로 갱신한다.todos
저장 변수에 새로운 리스트가 저장 된다. (상태 변화 발생) todos
로 지정한다.<li>
태그가 순차적으로 쌓이게 된다. 코드 렌더링 결과
위 영상을 보면 useState을 통해 상태 변화가 이루어진 것을 볼 수가 있다.
useEffect는 컴포넌트가 렌더링 발생하는 경우 Effect Hook가 실행되도록 하는 함수이다.
대표적으로 렌더링이 발생하는 예는 3가지가 있다.
useEffect
useEffect( () => { 함수 }, 종속 변수)
코드는 위와 같이 생성 되었으며 newTodo
는 문구를 타이핑할 경우 상태 변화가 일어나는 useState의 변수 였다.
코드 렌더링 결과
종속 변수의 유무 차이
useEffect(() => {}) state, props 변경 시마다 작동
useEffect(() => {}, []) 최초 1회 컴포넌트 렌더링될 경우만 작동
useEffect(() => {}, [value]) value 변경 시 작동
useEffect 사용 시 주의할 점
컴포넌트 최상위에서만 Hook를 호출 가능
React 함수 내에서만 Hook을 호출 가능
React Hook을 통해 알수 있는 장점은 Hook을 통해 정적인 상황에서
동적으로 상태 변화를 줄 수 있다는 점이다.
또한, useState은 함수형 컴포넌트에서 상태 변화값을 관리할때
useEffect는 타이머, 로깅, sideEffect 등을 발생 시키는 함수인 것을 확인할 수가 있었다.