TorrentCardListView.vue

使用VInfiniteScroll
This commit is contained in:
falling
2024-06-17 15:39:13 +08:00
parent 8d211ed20b
commit 66a5a40482
+14 -27
View File
@@ -2,7 +2,6 @@
import _ from 'lodash' import _ from 'lodash'
import type { Context } from '@/api/types' import type { Context } from '@/api/types'
import TorrentCard from '@/components/cards/TorrentCard.vue' import TorrentCard from '@/components/cards/TorrentCard.vue'
import { debounce } from 'lodash'
interface SearchTorrent extends Context { interface SearchTorrent extends Context {
more?: Array<Context> more?: Array<Context>
@@ -127,16 +126,11 @@ onMounted(() => {
}) })
groupedDataList.value = groupMap groupedDataList.value = groupMap
window.addEventListener('scroll', handleScroll)
})
onBeforeUnmount(() => {
window.removeEventListener('scroll', handleScroll)
}) })
// 只监听filterForm和groupedDataList的变化。因为displayDataList的变化不需要清空列表 // 只监听filterForm和groupedDataList的变化。因为displayDataList的变化不需要清空列表
watch([filterForm,groupedDataList], filterData) watch([filterForm, groupedDataList], filterData)
function filterData(){ function filterData() {
// 清空列表 // 清空列表
dataList = [] dataList = []
displayDataList.value = [] displayDataList.value = []
@@ -182,20 +176,10 @@ function filterData(){
}) })
} }
//滚到底部时,加载新的数据。 function loadMore({ done }: { done: any }) {
const handleScroll = debounce(() => { const itemsToMove = dataList.splice(0, 20) // 从 dataList 中获取最前面的 20 个元素
const bottomOffset = 50 // 距离底部多少像素开始加载 displayDataList.value.push(...itemsToMove)
const scrollTop = window.scrollY done('ok')
const windowHeight = window.innerHeight
const documentHeight = document.documentElement.scrollHeight
if (scrollTop + windowHeight + bottomOffset >= documentHeight) {
loadMore()
}
}, 100)
function loadMore() {
const itemsToMove = dataList.splice(0, 20); // 从 dataList 中获取最前面的 20 个元素
displayDataList.value.push(...itemsToMove);
} }
</script> </script>
@@ -281,9 +265,12 @@ function loadMore() {
</VCol> </VCol>
</VRow> </VRow>
</VCard> </VCard>
<div class="grid gap-3 grid-torrent-card items-start"> <VInfiniteScroll mode="intersect" side="end" :items="displayDataList" class="overflow-hidden"
<div v-for="(item) in displayDataList" :key="`${item.torrent_info.page_url}`"> @load="loadMore">
<TorrentCard :torrent="item" :more="item.more" /> <template #loading />
</div> <template #empty />
</div> <div class="grid gap-3 grid-torrent-card items-start">
<TorrentCard v-for="item in displayDataList" :key="`${item.torrent_info.page_url}`" :torrent="item" :more="item.more" />
</div>
</VInfiniteScroll>
</template> </template>