mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-05 07:28:37 +08:00
TorrentCardListView.vue
使用VInfiniteScroll
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user