하이브리드로 만든 앱에 뒤로가기 버튼 터치 시 팝업을 닫아줘야했다.
방법을 찾다보니 만난게 history.pushState()
// html5에 새로 추가된 url 변경 메소드
history.pushState(상태, unused, url(optional))
네이티브에서 뒤로가기 시 이벤트를 해야해서
사용자의 히스토리가 바뀔 때 실행되는 이벤트 popstate랑 사용했다.
popstate 이벤트는 뒤로가기 등 history 이벤트가 발생할 때 동작하는 액션이다.
두 함수를 활용해서 history.pushState때는 제자리에 머무르도록 하고, popState이벤트에 뒤로가기 발생 시 실행할 액션을 넣어주었다.
const preventGoBack = () => {
closeConfirmDialog()
navigate('/pms', { replace: true })
}
useEffect(() => {
history.pushState(null, '', location.href)
window.addEventListener('popstate', preventGoBack)
return () => {
window.removeEventListener('popstate', preventGoBack)
}
}, [])
만들어진 함수를 gpt한테 설명해달라고 했다 :) 요즘 코드 짜고나면 gpt한테 코드리뷰를 자주 부탁하고있다.
이 코드는 React의 useEffect 훅을 사용하여 페이지에 접근 시 브라우저의 뒤로가기 버튼을 막는 역할을 하는 것으로 보입니다. 코드를 간략하게 설명하겠습니다.
- preventGoBack 함수: 이 함수는 뒤로가기를 막고, closeConfirmDialog()를 호출한 후에 /pms 경로로 이동하는 역할을 합니다.
- useEffect 훅: 이 훅은 컴포넌트가 마운트될 때 한 번 실행되고, 뒷정리(cleanup) 함수를 통해 컴포넌트가 언마운트될 때 실행됩니다.
- history.pushState(null, '', location.href): 이 부분은 현재 페이지의 상태를 변경하여 브라우저 히스토리에 새 항목을 추가합니다. 이렇게 함으로써 사용자가 뒤로가기 버튼을 눌러도 실제로는 페이지가 변하지 않습니다. 이것이 뒤로가기를 막는 핵심 부분입니다.
- window.addEventListener('popstate', preventGoBack): 뒤로가기 이벤트(popstate)가 발생할 때 preventGoBack 함수를 실행하도록 이벤트 리스너를 등록합니다.
- 뒷정리(cleanup) 함수: 컴포넌트가 언마운트될 때, 즉 페이지를 벗어날 때 실행되는 함수입니다. 여기서는 window.removeEventListener를 사용하여 이전에 등록한 이벤트 리스너를 제거합니다. 이것이 중요한 이유는 컴포넌트가 언마운트될 때 리소스 누수를 방지하기 위해서입니다.
이 코드의 목적은 사용자가 페이지를 떠날 때(뒤로가기 버튼을 누를 때) 특정 작업을 수행하고자 하는 것으로 보입니다. 페이지를 벗어날 때 추가적인 동작을 정의할 때 유용한 패턴 중 하나입니다.
항상 새롭게 배울게 생긴다.
참고
- https://developer.mozilla.org/ko/docs/Web/API/Window/popstate_event
- https://developer.mozilla.org/ko/docs/Web/API/History/pushState
반응형
'개발 > Javascript' 카테고리의 다른 글
[자스 딥다이브 스터디] 04장 변수 (4) | 2024.02.22 |
---|---|
[Javascript] p5js로 해머게임 만들기 (빵형의 개발도상국) (4) | 2024.01.21 |
[Redux-Saga & Next.js] getServerSideProps에서 dispatch 수행하기 (store.dispatch(END), store.sagaTask.toPromise()) (0) | 2023.12.21 |
[Next.js] create-next-app으로 프로젝트 만들고 기본 라우팅까지 잡아보기 (0) | 2023.07.13 |
[Javascript] 웹팩 변경사항 바로바로 적용하기 (webpack-dev-server) (2) | 2023.06.07 |