Revert "Feat/virtualizarefactor: virtualization rework — unify Virtual components, fix memory leaks, migrate 15+ consumerstion rework (#472)"

This reverts commit 5953496d84.
This commit is contained in:
jxxghp
2026-05-15 21:42:43 +08:00
parent 5953496d84
commit 546af84dab
51 changed files with 2133 additions and 2401 deletions
+9 -19
View File
@@ -2,7 +2,6 @@
import api from '@/api'
import { RecommendSource } from '@/api/types'
import MediaCardSlideView from '@/views/discover/MediaCardSlideView.vue'
import VirtualList from '@/components/virtual/VirtualList.vue'
import { useI18n } from 'vue-i18n'
import { useDisplay } from 'vuetify'
import { useDynamicHeaderTab } from '@/composables/useDynamicHeaderTab'
@@ -270,25 +269,16 @@ onActivated(async () => {
<template>
<div class="mp-recommend">
<!-- 滚动内容区域 -->
<!--
VirtualList 纵向虚拟化 13 SlideView
原先 TransitionGroup 把所有 SlideView 一直挂在 DOM 导致
13 × ~15 visible cards = 195 张卡 + 195 decoded bitmap 常驻
虚拟化后只挂载视口附近 2-3 SlideView
estimate-size=320 9rem 卡片高(216px) + 标题/边距(~100px)
-->
<div class="recommend-content">
<VirtualList
:items="filteredViews"
:estimate-size="320"
key-field="title"
:overscan="2"
use-window-scroll
>
<template #item="{ item }">
<MediaCardSlideView v-bind="item" :ready="isReady" class="content-group" />
</template>
</VirtualList>
<TransitionGroup name="fade">
<MediaCardSlideView
v-for="item in filteredViews"
:key="item.title"
v-bind="item"
:ready="isReady"
class="content-group"
/>
</TransitionGroup>
<div v-if="isReady && filteredViews.length === 0" class="empty-category">
<VIcon icon="mdi-alert-circle-outline" size="large" class="empty-icon" />
+17 -24
View File
@@ -6,18 +6,13 @@ import api from '@/api'
import type { Context } from '@/api/types'
import TorrentCard from '@/components/cards/TorrentCard.vue'
import TorrentItem from '@/components/cards/TorrentItem.vue'
import VirtualGrid from '@/components/virtual/VirtualGrid.vue'
import VirtualList from '@/components/virtual/VirtualList.vue'
import { useBreakpointCols } from '@/composables/virtual/useBreakpointCols'
import ProgressiveCardGrid from '@/components/misc/ProgressiveCardGrid.vue'
import TorrentFilterBar from '@/components/filter/TorrentFilterBar.vue'
import { useI18n } from 'vue-i18n'
import { useGlobalSettingsStore } from '@/stores/global'
import { useTorrentFilter, type FilterState } from '@/composables/useTorrentFilter'
import { useToast } from 'vue-toastification'
// 列数:按视口断点(路由级全宽页)
const cols = useBreakpointCols({ xs: 1, sm: 2, md: 2, lg: 3, xl: 4, xxl: 4 })
// 国际化
const { t } = useI18n()
@@ -1171,19 +1166,17 @@ onUnmounted(() => {
class="stream-result-item"
/>
</div>
<VirtualGrid
<ProgressiveCardGrid
v-else-if="filteredCardDataList.length > 0"
:items="filteredCardDataList"
:columns="cols"
:row-estimate-size="400"
:gap="16"
:overscan="3"
use-window-scroll
:get-item-key="getTorrentItemKey"
:min-item-width="300"
:estimated-item-height="400"
>
<template #item="{ item }">
<template #default="{ item }">
<TorrentCard :torrent="item" :more="item.more" />
</template>
</VirtualGrid>
</ProgressiveCardGrid>
<!-- 无结果时显示 -->
<div v-if="!progressActive && filteredCardDataList.length === 0" class="no-results">
<VIcon icon="mdi-file-search-outline" size="64" color="grey-lighten-1" />
@@ -1210,19 +1203,19 @@ onUnmounted(() => {
</div>
</div>
<div v-else-if="filteredRowDataList.length > 0" class="resource-list">
<VirtualList
<ProgressiveCardGrid
:items="filteredRowDataList"
:estimate-size="240"
:overscan="5"
use-window-scroll
:columns="1"
:gap="8"
:estimated-item-height="240"
:overscan-rows="6"
:get-item-key="getTorrentItemKey"
>
<template #item="{ item, index }">
<div :key="getTorrentItemKey(item, index)">
<TorrentItem :torrent="item" />
<VDivider v-if="index < filteredRowDataList.length - 1" class="my-2" />
</div>
<template #default="{ item, index }">
<TorrentItem :torrent="item" />
<VDivider v-if="index < filteredRowDataList.length - 1" class="my-2" />
</template>
</VirtualList>
</ProgressiveCardGrid>
</div>
</VCard>
</div>