goal
HOOK의 효용
- Hook을 사용하면 component로부터 state 관련 로직을 추상화할 수 있다.
- 따라서 컴포넌트 별로 독립적인 테스트와 재사용이 가능하다.
- Hook은 계층 변화 없이 state 관련 로직을 재사용할 수 있도록 도와준다.
State Hook
HOOK 이란 대체 무엇인가?
useState
자체가 HOOK 이며, HOOK은 특별한 함수이다.
useState의 특별한 기능은, state를 function component 내부에서 사용할 수 있도록 해준다는 점이다.
HOOK 은 언제 사용할까?
- function component를 사용하는 중간에, state를 추가하고 싶을 때 사용한다. (기존에는 class component로 바꿔야 했음)
state 변수 선언하기
- HOOK 을 호출해서(=
useState()
) function component 내부에 state 변수를 선언할 수 있게 한다. (여기서 state는 count
라는 변수로 설정함)
- 그리고 이 내부에 추가한 state(=
count
)는 component가 다시 렌더링 되어도 그대로 유지된다.
useState
는 현재의 state 값(count
)과 이 값을 업데이트하는 함수(=setCount
)를 동시에 제공한다.
따라서, useState
는 "state 변수 + state 변수를 갱신할 수 있는 함수" 를 반환한다.
- 이 함수(=
setCount
)는 (주로) 이벤트핸들러 등에서 호출할 수 있다.
useState
는 인자로 state의 초기값을 넘겨준다.
객체일 필요는 없으며, number type 또는 string type이 올 수 있다.
( useState(100)
=> 여기서는 num type의 100을 초기값으로 설정함)
const [count, setCount] = useState(100);
위 코드에서
state 변수 count
를 선언하고 100으로 초기화한다.
초기값(100)은 "첫번째 렌더링 시"에만 "한번" 사용된다.
리액트는 해당 변수(count
)를 리렌더링할 때 기억하고,
가장 최근에 갱신된 값을 제공한다.
count
의 값을 갱신하려면, setCount를 호출하면 된다.
- 하나의 component 내부(= StateHook)에서 State HOOK을 여러 개 사용할 수도 있다.
단, (리액트는) useState
가 사용된 순서대로 실행한다.
state 가져오기
{this.state.count}
에서 👉️
{count}
처럼 바로 사용 가능하다.
state 갱신하기
- this를 호출하지 않아도 된다.
onClick={ () => this.setState({ count:this.state.count+1 }) }
에서 👉️
onClick={ () => setCount(count+1) }
처럼 사용한다.
class component와의 차이점
- 클래스 컴포넌트의 this.setState와 달리 state를 갱신하는 것은 병합하는 것이 아니라 대체하는 것이다.
(= 이전 state와 새로운 state를 합치지 않는다)
import React, { useState } from 'react';
function StateHook() {
const [count, setCount] = useState(100);
console.log(count)
console.log(setCount)
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}> + </button>
<button onClick={() => setCount(count - 1)}> - </button>
</div>
);
}
export default StateHook;