Show 아 그거 뭐였지Front-End [Angular] 자바스크립트 뒤로가기 데이터 유지승발자 2022. 1. 9. 20:57 ※ 2022년 03월 14일 내용이 너무 빈약하여 수정하였습니다. ※Q. 뒤로 가기해도 데이터 위치 유지 해주세요쇼핑몰 프로젝트 진행 중. 상품 리스트 클릭후 뒤로 가기 시 해당 상품으로 포커싱이 되게 해 달라는 요청이 있어 작업하게 되었다. 해당 방법외에도 여러 가지 방법이 있으니 이 코드가 정답이 아니라는것을 유의하길 바란다. 책임회피 해버리기~ 처음에는 localstorage를 사용해서 구현하였는데, 브라우저를 종료시켜도 데이터가 남아있는 경우가 있어 sessionstorage를 사용하여 구현하였다. 더보기 localstorage : 로컬에서 직접 삭제하기 전까지는 데이터가 남아있음 sessionstorage : 세션을 종료하기 전까지는 (ex_ 브라우저 창 닫기) 데이터가 남아있음 아이디어는 다음과 같다. 1. 뒤로 가기 이벤트가 아닐 시 async 요청 후 sessionstorage에 상품 리스트 데이터와 start값 저장
2. 상품 리스트에서 상품 클릭 시 상품 위치 값을 sessionstorage에 저장 3. 클릭된 상품에서 뒤로 가기로 상품 리스트에 왔을 시 async 요청을 하지 않고 sessionstorage 데이터 호출
4. sessionstroage에서 렌더링이 끝났으면 sessionstroage에 체크 (false)
???: 아니 뒤로가기 이벤트는 어떻게 감지함? 그걸 빼먹으면 어떡함! 바로 밑에 준비되어있다.
Angular에서는 HostListener를 사용하여 쉽게 뒤로가기 이벤트를 감지할수있다. Angular가 아닌 자바스크립트에서는
이런식으로 사용하면 될것같다. 기존에 react의 spa를 이용해서 페이지를 구현하던터라 페이징을 할 시에는 데이터를 새로 가져와서 렌더링이 되어 뒤로가기를 하면 이전의 다른 페이지가 렌더링 될 수 밖에 없던 상태였다. 내가 개발 중인 시스템은 뒤로가기를 하면 이전 번호의 페이지를 보여주도록 구현해야해서 조금 손을 봐야했다. 원래는 페이지 번호를 누르거나 이전 페이지 또는 다음 페이지 키를 누르면 데이터만 다시 fetch해와서 재렌더링하는 식이었다. 그러기 위해선 밑과 같이 항상 최상위 컴포넌트는 url로부터 페이지 번호 파라미터를 받아와야한다.
이렇게만 구현하면 내가 예상했던 대로 동작할 거라 기대했지만, 그렇지 않았다. url은 변경이 잘 되고 컴포넌트 자체도 수행이 잘 되는 것을 확인했지만 useEffect 훅이 무시되어 데이터의 변경이 일어나지 않았고 때문에 가상 DOM이 변화를 감지하지 못해 useEffect의 두 번째 파라미터를 보면 빈 배열임을 확인할 수 있다. 때문에 내가 url을 전달해서 컴포넌트를 재호출해도 이미 마운트된 상태이기 때문에 변화가 없는 것이었다. 이를 해결할 수 있는 방법은 1. props변화에 따라 useEffect 실행
2. 렌더링 후 항상 실행
로 두 가지 방법이 있다. |