개발공부/React
리액트 훅(React Hook) - 1
김놀먹
2022. 7. 12. 03:14
리액트 16.8 에서 Hooks 라는 기능이 도입되면서 함수형 컴포넌트에서도 상태를 관리할 수 있게 되었다.
(이전에는 상태를 관리하기 위해 class 기반 컴포넌트를 작성해야 했다. => 함수형에 비해 유지보수 복잡)
※ 왜 class형 컴포넌트를 쓰지 않고 Hook과 함수형 컴포넌트를 쓸까?
class형 컴포넌트의 길어지는 코드 길이 문제, 중복 코드, 가독성 문제 등을 해결하기 위해
useState
- React에서 import
- 컴포넌트에서 상태를 관리
- const [data, setData] = useState(data의 초기값)
// 원래는 이런 형태지만 배열 비구조화 할당을 통하여 각 원소를 추출해준 것
const numberState = useState(0);
const number = numberState[0];
const setNumber = numberState[1];
- useState 함수를 호출하면 배열을 반환하는데, 첫번째 원소는 현재 상태의 값이고 두번째 원소는 상태값을 갱신해주는 Setter 함수
- useState() 괄호안의 값은 상태의 초기값
useRef
- React에서 import
- 특정 DOM을 선택할 때 사용
- useRef() 를 사용하여 Ref 객체를 만들고, 이 객체를 선택하고 싶은 DOM 에 ref 값으로 설정 => Ref 객체의 .current 값은 원하는 DOM 을 가르킴
useEffect
- React에서 import
- 컴포넌트의 라이프사이클(mount, update, unmount)을 컨트롤
useEffect ( () => { } ); // 재렌더링 마다 코드실행
useEffect ( () => { } , [ ] ); // mount 시 코드실행
useEffect ( () => { } , [ state ] ); // 특정 state 변경시에만 코드 실행
useEffect ( () => { return()=>{} } , [ ] ); // unmount 시 코드 실행
// Callback 함수
// Dependency Array ( 의존성 배열 / 뎁스)
// 의존성 배열내에 들어있는 값이 변화하면 콜백함수가 수행된다.
useMemo
Memoization : 이미 계산해 본 연산 결과를 기억해두었다가 동일한 계산을 시키면, 다시 연산하지 않고 기억해두었던 데이터를 반환시키게 하는 방법
- React에서 import
- Memoization 하고 싶은 함수를 감싸서 최적화
- 함수를 전달받아서 그 함수가 리턴하는 값을 리턴하기 때문에 다른 곳에서 쓸 때는 함수로 쓰는게 아니라 값으로 사용
const Example = useMemo(() => {
// 함수내용
}, [data]); // data 가 변할때만 함수 재실행
const value = Example;
// cosnt value = Example() <- 이렇게 쓰면 안됨
useMemo는 연산결과(함수)를 재사용 / React.memo는 컴포넌트를 재사용
useCallback
- React에서 import
- Memoization 된 콜백함수를 반환
- 함수는 현재 state 값을 참조할 수 있어야 하기 때문에 컴포넌트가 재생성될 때 다시 생성되는 것이므로, Dependency Array 를 빈배열로 전달하면 문제가 생길 수 있음 ⇒ setState( ( )=> { } )
(setStat함수에 인자로 함수를 전달하여 최신의 state를 참조할 수 있게 해야함)
const example = useCallback(() => {
// 함수내용
}, []);