const[state, setState] = useState(“초기값”);
setState((prevState) => {
//some Work
return newState;
})
useEffect(()=>{
// 수행할 작업
return ()=>{
// Clean Up
}
},[deps])
useEffect(() => {
console.log("맨 처음 렌더링될 때(마운트) 한 번만 실행");
},[]);
useEffect(() => {
console.log(name);
console.log("name이라는 값이 업데이트 될 때만 실행");
},[name]);
useEffect(() => {
console.log("렌더링 될때마다 실행");
});
useEffect는 컴포넌트 안에서 불러내어 state변수나 props에 접근이 가능하고, 기본적으로 첫번째 렌더링과 이후의 모든 업데이트에서 수행된다. 두번째 인자로 조건을 걸어 첫번째 렌더링이나 특정한 조건일때만 수행되도록 하는 것도 가능
useEffect(() => {
// 브라우저 API를 이용하여 문서 타이틀을 업데이트.
document.title = `You clicked ${count} times`;
});
모든 effect는 정리를 위한 함수를 반환할 수 있다. 이 방법으로 구독의 추가와 제거를 하나의 effect로 구성할 수 있음. 마운트 해제 시점에 컴포넌트가 정리된다.
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
// effect 이후에 어떻게 정리(clean-up)할 것인지 표시
return function cleanup() {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
모든 렌더링 이후에 effect를 정리하거나 적용하는 것이 때때로 성능 저하를 발생시킨다. 특정 값들이 리렌더링 시에 변경되지 않는다면 effect를 건너뛰도록 할 수 있다. useEffect는 선택적으로 두번째 인수를 배열로 넘기면 가능.
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]); // count가 바뀔 때만 effect를 재실행