refactor: optimize Keep-Alive component rendering and data synchronization by introducing silent refresh states and fallback layout calculations.

This commit is contained in:
jxxghp
2026-05-17 14:06:05 +08:00
parent 348ae6b313
commit 0e005c3c7e
13 changed files with 197 additions and 78 deletions

View File

@@ -5,6 +5,7 @@ import DownloadingListView from '@/views/reorganize/DownloadingListView.vue'
import NoDataFound from '@/components/NoDataFound.vue'
import { useI18n } from 'vue-i18n'
import { useDynamicHeaderTab } from '@/composables/useDynamicHeaderTab'
import { useKeepAliveRefresh } from '@/composables/useKeepAliveRefresh'
// 国际化
const { t } = useI18n()
@@ -52,7 +53,7 @@ onMounted(async () => {
registerTabs()
})
onActivated(async () => {
useKeepAliveRefresh(async () => {
await loadDownloaderSetting()
registerTabs()
})

View File

@@ -14,6 +14,7 @@ import { useTorrentFilter, type FilterState } from '@/composables/useTorrentFilt
import { useDynamicButton } from '@/composables/useDynamicButton'
import { usePWA } from '@/composables/usePWA'
import { useToast } from 'vue-toastification'
import { useKeepAliveRefresh } from '@/composables/useKeepAliveRefresh'
// 国际化
const { t } = useI18n()
@@ -611,6 +612,13 @@ function handleSearchStreamMessage(eventData: { [key: string]: any }) {
// 按请求搜索
async function searchByRequest(params: SearchParams, requestToken?: string) {
const items = await requestSearchResults(params, requestToken)
streamTotalCount.value = items.length
setStreamResults(items)
}
// 静默刷新使用普通请求,保留当前结果直到新数据完整返回,避免返回页面时露出搜索进度态。
async function requestSearchResults(params: SearchParams, requestToken?: string) {
let result: { [key: string]: any }
// 如果keyword的格式是 xxxx:xxxxx 且:前面的xxxx为字符则按照媒体ID格式搜索
if (/^[a-zA-Z]+:/.test(params.keyword)) {
@@ -637,13 +645,11 @@ async function searchByRequest(params: SearchParams, requestToken?: string) {
}
if (result && result.success) {
streamTotalCount.value = result.data?.length || 0
setStreamResults(result.data || [])
} else {
errorDescription.value = result?.message || t('resource.noResourceFound')
streamTotalCount.value = 0
setStreamResults([])
return (result.data || []) as Context[]
}
errorDescription.value = result?.message || t('resource.noResourceFound')
throw new Error(errorDescription.value)
}
// 按流搜索
@@ -714,13 +720,14 @@ function changeViewType(newType: string) {
}
// 获取搜索列表数据
async function fetchData(options: { force?: boolean; params?: SearchParams } = {}) {
async function fetchData(options: { force?: boolean; params?: SearchParams; silent?: boolean } = {}) {
const currentSearchParams = { ...(options.params ?? activeSearchParams.value) }
if (hasSearchKeyword(currentSearchParams)) {
activeSearchParams.value = { ...currentSearchParams }
rememberSearchParams(currentSearchParams)
}
const requestToken = options.force || Boolean(currentSearchParams.keyword) ? createSearchRequestToken() : undefined
const silentRefresh = Boolean(options.silent && isRefreshed.value && rawDataList.value.length > 0)
try {
enableFilterAnimation.value = true
@@ -728,6 +735,11 @@ async function fetchData(options: { force?: boolean; params?: SearchParams } = {
// 查询上次搜索结果,并同步可重放的搜索参数
const results = await fetchLastSearchContext()
setStreamResults(results || [])
} else if (silentRefresh) {
// keep-alive 重新进入时后台刷新,旧结果继续显示,等新结果完整返回后一次性替换。
const results = await requestSearchResults(currentSearchParams, requestToken)
streamTotalCount.value = results.length
setStreamResults(results)
} else {
resetSearchResults()
startLoadingProgress()
@@ -1067,6 +1079,15 @@ onMounted(async () => {
void fetchData()
})
useKeepAliveRefresh(async () => {
if (progressActive.value || isRefreshing.value || isRecommending.value || showingAiResults.value) return
const refreshParams = await resolveRefreshSearchParams()
if (!refreshParams) return
await fetchData({ force: true, params: refreshParams, silent: true })
})
// 卸载时停止轮询
onUnmounted(() => {
closeSearchEventSource()