프레임워크는 nuxt3 (vue 기반)
1. 많은 수량의 이미지를 나열하는 기본적인 페이지가 있음
2. query에 따라 필터링을 하고
3. 이미지를 클릭하면 detail 페이지를 띄움
4. 인피니트 스크롤임
5. 한번 스크롤시 72개 불러옴
기본적으로 핀터레스트 비슷한 느낌인데 좀 도와주세여
고민이 뭐냐면
다른 필터 조건으로 검색해서 넘어갔다가
뒤로가기해서 원래 페이지로 돌아갈때
전페이지의 데이터를 다시 로딩하는데 첫번째 페이지만 가지고오는 구조임
onMounted(() => {
// 필터 query만 watch 하여 변할경우 page를 1로 리셋하고, api에서 현재 page 변수와 query 변수로 데이터 가져오기
// 필터 query가 안변하고 page만 변할 경우(스크롤 시), 현재 데이터에 다음 페이지 데이터 가져와서 추가
})
그러니까 전페이지에서 스크롤을 많이 내렸으면 다른곳 갔다가 다시 돌아오면
스크롤 복구도 안되고 만약 존나 많이 내렸다면 1페이지부터 다시 스크롤해야함
detail페이지는 다른 컴포넌트라 들어갔다가 list페이지로 뒤로가기하면
마지막 상태가 고대로 보존되어 있음
문제가 없음
내 솔루션
1. query parameter (필터 조건 및 페이지)를 key로 하여 데이터json와 스크롤 포지션을 일일이 캐시해놓는다
2. query parameter을 key로 하고 스크롤 포지션만 캐시 후 캐시된 page까지 api에서 데이터를 로드하고 스크롤 포지션을 restore한다
3. 모르겠다 ???
10개의 댓글
무분별한 사용은 차단될 수 있습니다.
undefined
이런거에 정답은 없음ㅋㅋ 스스로 내린 솔루션 중에 2번이 제일 자연스러울 것 같은데? 스크롤 포지션 (offset/page) 가 url에 남아있으니 어쨌거나 불러오면 그만이고..
유저 사용 통계 바탕으로 얼마나 "뒤로가기"를 많이 하는지 파악해서 사용량이 많으면 1번으로 바꿔도 될것 같음
너가전부옳아
분명 프론트엔드가 이전보다 존나 발전했는데
순 html로 로드 할때가 덜 골치 아팠던거 같아.......
초전도쳉ㅍㄱ
옛날에 이거때문에 클라이언트가 요청한적 있었는데
걍 "마우스 좌측 뒤로가기나 브라우져 뒤로가기"는 우리가 컨트롤 할수없는 영역이라고 둘러댐 ㅋㅋ
유튜브PC버전만봐도 작성자 상황이랑 비슷하다
프로그래머스
keepalive쓰면 되는거 아님?
너가전부옳아
keepalive쓰면 다른 컴포넌트 간 전환시 괜찮은거 아님?
아니면 page key를 route.query로 묶고 keepalive를 같이 써볼까
프로그래머스
https://velog.io/@nikki/TIL-Nuxt
안됨?
너가전부옳아
흠 그니까
다른 컴포넌트 간에는 keepalive가 통함
예) 해당 리스트페이지를 쭉 내렸다가
about페이지 갔다가 다시 리스트페이지로 뒤로가기해서 돌아오기
그럼 됨 완벽함
데이타, state, dom, 스크롤 포지션 전부 유지됨
근데 위처럼 1개의 같은 컴포넌트 안에서는
(같은 리스트 페이지 컴포넌트 안에서 필터 조건만 바꾸는 상황, query parameter만 변함)
1. route의 query를 watch해서 변할 시 api를 다시 call 하고 data만 교체하거나
(page load 없음, unmounted, mounted 사이클 안돔)
2. 아니면 page key를 route의 query 파라메터로 지정을 해서,
query파라메터가 변할 시 다른 page로 인식해서 페이지를 reload 해야하는데
(unmounted, mounted 사이클 다시 돔)
둘다 keepalive가 적용이 안됨
프로그래머스
몬말인지 정확히 이해가 안가는데
현재 페이지 안에서, query에 따라 리스트가 변하는데, 이전 query의 리스트 데이터를 유지하고 싶다는거임?
그러면 query별로 보여줄 list를 각각 컴포넌트화하고, 해당 컴포넌트들을 query에 따라서 보여지도록 keepalive 걸면 될거같은데
```js
<template>
...다른 태그 및 컴포넌트들
<KeepAlive>
<List1 v-if="query === 'first'" />
<List2 v-else-if="query === 'second'" />
....기타 리스트들
</KeepAlive>
</template>
<script setup>
const route = useRoute();
const query = computed(() => ...원하는 쿼리);
</script>
```
이럼 안됨?
너가전부옳아
query가 한둘세가지가 아니라
경우의수가 많음
그니까 다나와에서 컴퓨터 산다 생각하면 됨
cpu: 10세대 11세대 12세대 13세대
메모리: ddr3 ddr4 ddr5
글카: nvidia amd
그외 이런저런 필터들
이래 필터가 있자나
이걸 if문으로 할순없지
프로그래머스
그런거면 요구사항이 너무 무리한거 같은데
정확하게 어느정도까지 저장되는걸 원하는지 명확하게 정할 필요가 있을듯
굳이 구현한다면 런타임 메모리에서 들고있기에는 너무 비대해질 수 있으니, indexedDB에다가 넣어놓고 꺼내쓰는 방안이 젤 나을거 같은데
아니면 최신 몇개의 조건만 리스트를 메모리에 넣어놓고 꺼내쓰던지