Hooks는 클래스를 사용하지 않고도 함수 컴포넌트에서 상태를 사용할 수 있도록 만들어주는 React의 새로운 기능이자 컨셉이다.
공식문서를 통한 항목을 살피자
import React, { useState } from 'react';
function Example() {
// "count"라는 새 상태 변수를 선언합니다
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
여기서 useState가 바로 Hook 이다.
Hook을 호출해 함ㅅ ㅜ컴포넌트 안에 state를 추가했다.
이 state는 컴포넌트가 다시 렌더링 되어도 그대로 유지될 것이다.
useState는 현재의 state 값과 이 값을 업데이트하는 함수를 쌍으로 제공한다.
우리는 이 함수를 이벤트 핸들러나 다른 곳에서 호출할 수 있다.
이것은 class의 this.setState와 거의 유사하지만, 이전 ㄴㅅㅁㅅㄷdhk tofhdns state를 합치지 않는다는 차이점이 있다.
useState는 인자로 초기 state값을 하나 받는다.
카운터는 0부터 시작하기 때문에 위 예시에서는 초기값으로 0을 넣어준 것이다.
this.state와는 달리 setState Hook의 state는 객체일 필요가 없다.
이 초기값은 첫 번째 렌더링에만 딱 한번 사용된다.
function ExampleWithManyStates() {
// 상태 변수를 여러 개 선언했습니다!
const [age, setAge] = useState(42);
const [fruit, setFruit] = useState('banana');
const [todos, setTodos] = useState([{ text: 'Learn Hooks' }]);
// ...
}
Hook은 함수 컴포넌트에서 React state와 생명주기 기능(lifecycle features)을 "연동(hook into)" 할 수 있게 해주는 함수이다.
hook은 class안에서는 동작하지 않는다.
대신 class 없이 React를 사용할 수 있게 해주는 것이다.
React는 useState 같은 내장 Hook을 몇 가지 제공한다.
Effect Hook, 즉 useEffect는 함수 컴포넌트 내에서 이런 side effects를 수행할 수 있게 해준다.
React class의 componentDidMount 나 componentDidUpdate, componentWillUnmount 와 같은 목적으로 제공되자먼, 하나의 API로 통합된 것이다.
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// componentDidMount, componentDidUpdate와 비슷합니다
useEffect(() => {
// 브라우저 API를 이용해 문서의 타이틀을 업데이트합니다
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
useEffect를 사용하면, React는 DOM을 바꾼 뒤에 "effect" 함수를 실행할 것이다.
useEffect가 하는 일은?
useEffect를 컴포넌트 안에서 불러내는 이유는?
Hook은 그냥 JavaScript 함수이지만, 두 가지 규칙을 준수해야 한다.
최상위(at the top level)에서만 Hook을 호출해야 한다. 반복문, 조건문, 중첩된 함수 내에서 Hook을 실행하지 말아야한다.
React 함수 컴포넌트 내에서만 Hook을 호출해야 한다. 일반 JavaScript 함수에서는 Hook을 호출해서는 안된다.
(Hook을 호출할 수 있는 곳이 딱 한 군데 더있는데 바로 직접 작성한 custom Hook 안 이다.)
1: import React, { useState } from 'react';
2:
3: function Example() {
4: const [count, setCount] = useState(0);
5:
6: return (
7: <div>
8: <p>You clicked {count} times</p>
9: <button onClick={() => setCount(count + 1)}>
10: Click me
11: </button>
12: </div>
13: );
14: }
effect에 정리(clean-up)가 필요한 경우에는 함수를 반환한다.
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
정리(clean-up)가 필요없는 경우에는 어떤 것도 반환하지 않습니다.
useEffect(() => {
document.title = `You clicked ${count} times`;
});
이처럼 effect Hook은 두 가지 경우를 한 개의 API로 통합한다.