티스토리 뷰

문득 useEffect return과 beforeunload의 실행 순서가 궁금해져서 직접 실험해보았다. useEffect의 개념과 beforeunload 개념을 안다는 조건으로 포스팅을 작성해본다.

 

✔️ useEffect 관련 링크


https://hyermione.tistory.com/56

 

[뷰쟁이의 리액트 시작하기] react useEffect로 랜더링 상태 관리하자

[!이시중] 2021년 11월 1일 22:53에 최초 작성된 글로써 원글은 https://yuniel.tistory.com/44 에서 확인할 수 있음. react에서 hook을 도입하면서 제일 좋아진 이점은 바로 함수형 컴포넌트 + 상태 관리가 한 번

hyermione.tistory.com

https://hyermione.tistory.com/92

 

React(리액트) clean-up 함수란? (메모리 누수 경고 해결 방법)

가끔 개발을 진행하며 데브툴에 뜨는 에러를 보다보면 clean-up이라는 경고가 표기된다. 다행스럽게도 '경고'이기 때문에 기능에는 문제가 없으나 잡고가는게 당연히 좋을 것이다. 하여 clean-up이

hyermione.tistory.com

 

 

✔️ beforeunload 관련 링크


https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event

 

Window: beforeunload event - Web APIs | MDN

The beforeunload event is fired when the window, the document and its resources are about to be unloaded. The document is still visible and the event is still cancelable at this point.

developer.mozilla.org

 

✔️ useEffect에서 return과 beforeunload 차이점


(상단의 개념들에 따라) useEffect에서 return은 컴포넌트가 unmount 될 때 실행되는 개념이고, beforeunload는 페이지를 뜰 때 실행되는 개념이다.

 

✔️ 두 함수의 실행 순서는 어떻게 되는걸까?


두 개념을 보고 있으니 갑자기 떠오르는 궁금증이 생겼다. 다른 페이지로 이동 시, 컴포넌트를 제거하고 페이지를 뜨게 되는걸까? 아니면 페이지 이동을 하고 컴포넌트가 제거되는걸까? 그럼 두 함수 중에 뭐가 먼저 실행될까?

해서 다음과 같은 코드를 임시로 만들었다. (나는 test용으로 addEventListener만 작성하였지만 사용에 따라 removeEventListener도 작성할 것을 추천한다.)

const Test = () => {

  useEffect(() => {
    console.log('들어옴');
    window.addEventListener('beforeunload', (event) => {
      event.preventDefault();
      window.alert('!!!');
    })
    return () => {
      console.log('나감');
    }
  }, []);

  return <div>테스트이다!</div>
};

export default Test;

페이지를 떠난다는 가정하에

예상 시나리오 1. '나감'이 먼저 콘솔에 찍히고, 이후 '!!!'의 알럿이 뜬다.
예상 시나리오 2. '!!!'의 알럿이 뜨고, 콘솔에 '나감'이라는 문구가 찍힌다.

 

✔️ 결과는 과연?


페이지를 뜨는 것은 beforeunload에 해당하기 때문에 해당 알럿이 먼저 뜨게 된다.

포스팅을 작성하는 와중에 이는 지극히 당연하다는 것을 깨달았다. useEffect return은 unmount(unload)인데, 이 직전에 뜨는 이벤트가 beforeunload아닌가... 왜 이걸 이제야 생각한거지? 아무튼 beforeunload event의 로직이 먼저 실행되며 useEffect return의 로직은 실행되지 않는다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함