Hook 은 React 16.8 버전부터 React 요소로 새로 추가가 되었습니다. Hook을 이용하여 기존 Class바탕의 코드를 작성할 필요 없이 상태값과 여러 React의 기능을 사용할 수 있습니다.
우선, React Hook을 만든 이유는 기존의 React가 컴포넌트 사이에서 상태로직을 재사용 하기 어렵고 무결성을 해치는 코드들이 많이 나왔었다고 한다. 그렇다고 기존 Class 컴포넌트들을 Hook 으로 리팩토링해야하느냐 ?
공식문서에는 Class를 제거할 계획도 없고 미래에도 계속 Class 컴포넌트들을 지원할 예정이라고 한다.
단, Hook은 브라우저의 메모리자원을 사용하기때문에 자원생각을 안하고 함부로 사용했다간 전체적인 성능저하를 불러올 수 있다.
아래는 버튼 클릭시 값이 증가하는 간단한 예제이다.
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={(e) => setCount(count + 1)}/>
</div>
);
}
위에서 사용된 useState() 가 훅이다.
해당 state는 컴포넌트가 다시 렌더링 되어도 그대로 유지가 되고 현재의 state 값 과 이 값을 업데이트하는 함수를 쌍으로 제공한다 (set이 아니여도 되지만 보통 set을 주로 사용).
useState 초기 state값을 인자로 하나 받고 (위 코드에서는 0으로 줬다.) 해당 초기값은 첫번째 렌더링에만 딱 한번 사용된다.
function Example() {
const [age, setAge] = useState(42);
const [fruit, setFruit] = useState('banana');
const [todos, setTodos] = useState([{ text: 'Learn Hooks'}]);
}
아래 예시는 타이틀을 바꾸는 컴포넌트이다
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `you clicked ${count} times`;
return (
<div>
<p>you clicked {count} times</p>
<button onClick={() => setCount(count+1)}/>
</div>
});
useEffect 를 사용하면 React는 DOM을 업데이트 한 이후에 effect 함수를 실행할것이다.
기본 Hook
this.state
, this.setState
와 같은 기능componentDidMount
componentDidUpdate
componentWillUnmount
를 대체useEffect(() => {
...
...
}, []);
배열 안에 요소가 변경이 될때마다 실행,
빈배열상태로 두면 최초 렌더링시에만 실행.
추가 Hooks
useEffect 사용
function Counter({initialCount}) {
const [count, setCount] = useState(initialCount);
return (
<>
Count: {count}
<button onClick={() => setCount(initialCount)}>Reset</button>
<button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
<button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
</>
);
}
useReducer 사용
const initialState = {count: 0};
function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}
React.createRef
를 대체function Example() {
const btnRef = useRef();
const onClick = () => {
btnRef.style.color = "red";
};
return (
<button onClick={onClick} ref={btnRef}/>
}
Library Hooks