: 컴포넌트에 기능을 추가할 때 사용하는 함수
ex) 컴포넌트에 상탯값 추가 or 자식 요소에 접근
대표적인 리액트 훅
1. useState : 상탯값 추가
2. useEffect : 부수효과 처리(서버 API호출, 이벤트 핸들러 등록 등)
const [count, setCount] = useState(0);
초기값을 넣어 호출
배열 반환 : 첫번째 아이템에는 상태값, 두번째 아이템에는 상태값 변경 함수
상태값 변경 함수는 비동기이면서 배치(batch)로 처리됨
setCount(v => v + 1);
window.addEventListener('click', onclick);
function onClick() {
ReactDOM.unstable_batchedUpdates(() => {
setCount(v => v + 1);
setCount(v => v + 1);
});
}
상태값 변경 함수는 호출한 순서대로 적용됨
여러개의 상태값을 하나의useState로 관리 할 수 있음(객체 이용)
const [state, setState] = useState({ name: '', age: 0 });
상태값 변경 함수를 호출할 때는 전체 객체를 새로 입력해 줘야함
onChange={e => setState({ ...state, name: e.target.value })}
📍 어러 상태값을 관리할 때는 useState보다는 useReducer가 더 적합
모든 부수 효과는 useEffect훅에서 처리하는게 좋음
useEffect(() => {
document.title = `업데이트 횟수: ${count}`;
});
첫번째 매개변수에 함수 작성(부수효과 함수) → 함수는 렌더링 결과가 실제 돔에 반영되고 비동기로 호출
✔️ userId를 속성값으로 받아 api를 호출해 해당 유저의 정보를 가져온 다음, user 상태값을 변경
export default function Profile({ userId }) {
const [user, setUser] = useState(null);
//userId가 변경될 때만 부수효과함수 실행
useEffect(() => {
getUserApi(userId).then(data => setUser(data));
}, [userId]);
return (
<div>
{!user && <p>사용자 정보를 가져오는 중...</p>}
{user && (
<>
<p>{`name is ${user.name}`}</p>
<p>{`age is ${user.age}`}</p>
</>
)}
</div>
);
}
const USER1 = { name: "mike", age: 23 };
const USER2 = { name: "jane", age: 31 };
//userId가 홀수일때 USER1리턴 짝수일때 USER2리턴
function getUserApi(userId) {
return new Promise[res => {
setTimeout(() => {
res(userId % 2 ? USER1 : USER2);
}, 500);
});
}
const [user, setUser] = useState(null);
의 setUser
값(상태값 변경 함수)은 변하지 않기 때문에 배열에 추가 안해도 됨.📍 이벤트 핸들러를 등록할 때 useEffect 부수효과 함수로 작성
📍 이벤트 핸들러 해제할 때 useEffect 반환 함수로 작성
useEffect(() => {
window.addEventListener('resize', onResize);
return() => {
window.removeEventListener('resize', onResize);
};
}, []);
export default function useUser(userId) {
const[user, setUser] = userState(null);
useEffect(() => {
getUserApi(userId).then(data => setUser(data));
}, [userId]);
return user;
}
//사용할때
const user = useUser(userId);
⇒ userId가 변경되면 훅 내부에서 자동으로 api를 호출해서 사용자 데이터 가져올 것
👍 비동기 방식으로 동기 방식처럼 사용 가능!