컴포넌트에서 데이터를 관리(State)하고 데이터가 변경될 때 상호작용(Effect)을 하기 위해 사용한다.
리액트 v16.8 에 새로 도입된 새로운 기능으로, class없이 state를 사용할 수 있다.
원래 함수형 컴포넌트에서는 클래스 컴포넌트의 장점인 state 사용이나 life cycle을 직접 다루는 등의 기능을 사용할 수 없었다.
이를 해결하기 위해 등장한 것이 Hook이다.
// React에 기본적으로 내장되어 있는 useState 훅을 사용해 state 생성
import { useState } from "react";
// 초기값 설정
const [isLoggedIn, setIsLoggedIn] = useState(false);
// setState를 이용해 state 값 변경
setIsLoggedIn(true);
const App = () => {
useEffect(EffectCallback, Deps?)
}
Deps
: 변경을 감지할 변수들의 집합 (배열) / EffectCallback
: Deps에 지정된 변수가 변경될 때 실행할 함수const App = () => {
const [count, setCount] = useState(0)
// 컴포넌트가 최초로 렌더링될 때, count가 변경될 때마다 콜백함수 호출
useEffect(() => {
console.log('버튼을 ${count}회 클릭했습니다.')
}, [count])
return (
<div>
<button onClick={() => setCount(count + 1)}>
클릭하세요
</button>
</div>
)
}
useEffect의 이펙트 함수 내에서 다른 함수를 return할 경우, state가 변경되어 컴포넌트가 다시 렌더링되기 전과 컴포넌트가 없어질 때(Destroy) 호출할 함수를 지정할 수 있다.
const App = () => {
useEffect(() => {
// State가 변경될 때(Updating), 컴포넌트를 렌더링할 때(Mounting) 호출됨
const intervalId = setInterval(() => {
console.log("안녕하세요");
}, 1000);
// 컴포넌트를 재렌더링 하기 전, 컴포넌트가 없어질 때 호출됨(Unmounting)
return () => {
clearInterval(intervalId);
}
}, [])
const App = () => {
const inputRef = useRef(null)
const onButtonClick = () => {
inputRef.current.focus()
}
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={onButtonClick}>input으로 포커스</button>
</div>
)
}
const App = () => {
const [firstName, setFirstName] = useState('철수')
const [lastName, setLastName] = useState('김')
// 이름과 성이 바뀔 때마다 풀네임을 메모이제이션
const fullName = useMemo(() => {
return `${firstName} ${lastName}`
}, [firstName, lastName])
}
useMemo(() => fn, deps)
와 useCallback(fn, deps)
는 동일함const App = () => {
const [firstName, setFirstName] = useState('철수')
const [lastName, setLastName] = useState('김')
// 이름과 성이 바뀔 때마다
// 풀네임을 return하는 함수를 메모이제이션
const getfullName = useCallback(() => {
return `${firstName} ${lastName}`
}, [firstName, lastName])
return <>{getfullname}</>
}