ReactJS/개념정리
[React] Cleanup function
xowoony
2023. 3. 17. 13:31
학습일 : 2023. 03. 17
앞서 학습했듯
useEffect는 컴포넌트가 최초로 만들어질 때
아래 처럼 마지막에 빈 배열을 줬을 경우
useEffect(iRunOnlyOnce, []);
처음 한번만 실행되고 끝이나는게 정상인데
그게 아니게 되는 경우가 있다.
바로 Cleanup function을 사용했을 경우 그렇게 되는데
Cleanup function 을 간단하게 설명하면
컴포넌트가 사라지게 될 경우
뭔가를 표시하거나, 뭔가를 할 수 있게 해주는 기능이다.
나는 컴포넌트가 사라지게 될 경우
콘솔에 "컴포넌트가 사라졌어요!" 라고 표시하고
컴포넌트가 다시 생겼을 경우
콘솔에 "컴포넌트가 만들어졌어요!" 라고 표시하고 싶다.
사용하는 방법은 아래와 같다
function Hello() {
useEffect(() =>{
console.log("컴포넌트가 만들어졌어요!");
return () => console.log("컴포넌트가 사라졌어요."); // cleanup function - 컴포넌트가 destroy될 때 뭔가 할 수 있도록 해줌.
}, []);
return <h1>안녕?</h1>;
}
useEffect() 안에
return () => console.log("...");
을 작성해주면 된다.
전체 코드
import { useState, useEffect } from "react";
// useEffect는 컴포넌트가 처음 생성될 때 실행된다
// 이것으로 인해 컴포넌트가 언제 생성되었는지, 언제 사라졌는지 알 수 있게 됨.
function Hello() {
useEffect(() =>{
console.log("컴포넌트가 만들어졌어요!");
return () => console.log("컴포넌트가 사라졌어요."); // cleanup function - 컴포넌트가 destroy될 때 뭔가 할 수 있도록 해줌.
}, []);
return <h1>안녕?</h1>;
}
function App() {
const [showing, setShowing] = useState(false); // default 값은 false
const onClick = () => setShowing((prev) => !prev); // 클릭시 반댓값을 리턴
return (
<div>
{/* js를 쓸때는 중괄호! */}
{/* showing이 참일 때 <Hello />를 반환, 아닐 때는 null */}
{showing ? <Hello /> : null}
{/* 버튼 - showing이 참일때 Hide, 아닐때 Show 로 텍스트가 변환 */}
<button onClick={onClick}>{showing ? "Hide" : "Show"}</button>
</div>
);
}
export default App;
조금 다르게 써본 코드
import { useState, useEffect } from "react";
// useEffect는 컴포넌트가 처음 생성될 때 실행된다
// 이것으로 인해 컴포넌트가 언제 생성되었는지, 언제 사라졌는지 알 수 있게 됨.
// 컴포넌트가 파괴될 대는 react.js가 hiFn이 리턴한 function 을 실행하게 된다.
function Hello() {
function byFn(){
console.log("컴포넌트가 사라졌어요");
}
function hiFn() {
console.log("컴포넌트가 만들어졌어요!");
return byFn; // cleanup function
}
useEffect(hiFn, []);
return <h1>안녕?</h1>;
}
function App() {
const [showing, setShowing] = useState(false); // default 값은 false
const onClick = () => setShowing((prev) => !prev); // 클릭시 반댓값을 리턴
return (
<div>
{/* js를 쓸때는 중괄호! */}
{/* showing이 참일 때 <Hello />를 반환, 아닐 때는 null */}
{showing ? <Hello /> : null}
{/* 버튼 - showing이 참일때 Hide, 아닐때 Show 로 텍스트가 변환 */}
<button onClick={onClick}>{showing ? "Hide" : "Show"}</button>
</div>
);
}
export default App;
실행결과
useEffect를 작성해주었는데도 불구하고
console에 계속 문구가 찍혀 나오는 이유는
처음에 컴포넌트가 사라져 있었다가
클릭시 컴포넌트가 (최초로) 다시 생성되는 격이기 때문에
콘솔에 찍혀나오게 되는 것이다.
Cleanup function은
컴포넌트가 사라지게 될 때 어떠한 분석결과를 얻고 싶을 때
사용할 수 있을 것이다.
(예를 들자면 언제 컴포넌트가 사라졌는지/생성되었는지)