컴포넌트가 랜더링될 때마다 특정 작업을 수행하도록 설정할 수 있는 Hooks이다.
useEffect(() => {
// 함수 영역(State가 바뀔때 함수 호출하여 라이프 사이클 최적화 함)
// componentDidMount, componentDidUpdate
}, ['State가 바뀔때 마다 실행']); // [] 번째 인수는 배열
//Cleanup
useEffect( () => {
return() => {
// useEffect Cleanup 실행
// 종료시에 활용( 예 로컬 스토리지 삭제)
}
})
useEffect(() => {}) // 모든 render일때 다시 실행 (dependencies없기때문에)
useEffect(() => {},[]) // 빈 배열, 아무것도 없을 경우 첫 render일때만 실행
useEffect(() => {},[state]) // state가 바뀔 때 마다 호출
예제
import React, { useState, useEffect } from 'react';
const Child = () => {
return(
<div>
<p>Child Component~!!!</p>
</div>
);
};
const UseEffect = () => {
const [show, setShow] = useState(false);
const onClick = () => {
setShow(!show);
}
// 모든 render일때 다시 실행
// useEffect( () => {
// console.log('모든 render일때 다시 실행');
// })
// 첫 render일때만 실행
// useEffect( () => {
// console.log('첫 render일때만 실행');
// },[])
// state가 바뀔 때 마다 실행
useEffect( () => {
console.log('state가 바뀔 때 마다 실행');
},[show])
return(
<div>
<button onClick={ onClick }>클릭~!!!</button>
{show ? <Child /> : null}
</div>
);
};
export default UseEffect;
Child Cleanup
import React, { useEffect, useRef, useState } from "react";
const Child = () => {
console.log(" Child render start");
const inputRef = useRef();
const [text, setText] = useState(() => {
console.log(" Child useState");
return "";
});
useEffect(() => {
console.log(" Child useEffect, no deps");
return () => {
console.log(" Child useEffect [Cleanup], no deps");
};
});
useEffect(() => {
console.log(" Child useEffect, empty deps");
inputRef.current.focus();
return () => {
console.log(" Child useEffect [Cleanup], empty deps");
};
}, []);
useEffect(() => {
console.log(" Child useEffect, [text]");
return () => {
console.log(" Child useEffect [Cleanup], [text]");
};
}, [text]);
function handleChange(event) {
setText(event.target.value);
}
return (
<>
<input type="text" onChange={handleChange} ref={inputRef} />
<p>{text}</p>
{console.log(" Child render End")}
</>
);
};
const Hookflow = () => {
console.log("App render Start");
const [show, setShow] = useState(() => {
console.log("APP useStgate");
return false;
});
useEffect(() => {
console.log("App useEffect, no deps");
return () => {
console.log("App useEffect [Cleanup], no deps");
};
});
useEffect(() => {
console.log("App useEffect, empty deps");
return () => {
console.log("App useEffect [Cleanup], empty deps");
};
}, []);
useEffect(() => {
console.log("App useEffect, [show]");
return () => {
console.log("App useEffect [Cleanup], [show]");
};
}, [show]);
function handleClick() {
setShow((prev) => !prev);
}
return (
<div>
<h1>Hook Flow </h1>
<button onClick={handleClick}>Search</button>
{show ? <Child /> : null}
{console.log("App render End")}
</div>
);
};
export default Hookflow;
답글 남기기