feat: optimize achievements tab loading

This commit is contained in:
Tim
2025-08-09 16:53:27 +08:00
parent 6b5b6b8c81
commit 760bc4fc4b
2 changed files with 31 additions and 31 deletions

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="achievements-list"> <div class="achievements-list">
<div <div
v-for="medal in medals" v-for="medal in props.medals"
:key="medal.type" :key="medal.type"
class="achievements-list-item" class="achievements-list-item"
> >
@@ -25,37 +25,13 @@
</template> </template>
<script setup> <script setup>
import { ref, watch } from 'vue' defineProps({
import { API_BASE_URL, toast } from '../main' medals: {
type: Array,
const props = defineProps({ required: true,
userId: { default: () => []
type: Number,
required: true
} }
}) })
const medals = ref([])
const fetchMedals = async () => {
const res = await fetch(`${API_BASE_URL}/api/medals?userId=${props.userId}`)
if (res.ok) {
medals.value = await res.json()
} else {
medals.value = []
toast.error('获取成就失败')
}
}
watch(
() => props.userId,
id => {
if (id) {
fetchMedals()
}
},
{ immediate: true }
)
</script> </script>
<style scoped> <style scoped>

View File

@@ -244,7 +244,7 @@
</div> </div>
<div v-else-if="selectedTab === 'achievements'" class="achievements-container"> <div v-else-if="selectedTab === 'achievements'" class="achievements-container">
<AchievementList :user-id="user.id" /> <AchievementList :medals="medals" />
</div> </div>
</template> </template>
</div> </div>
@@ -284,6 +284,7 @@ export default {
const timelineItems = ref([]) const timelineItems = ref([])
const followers = ref([]) const followers = ref([])
const followings = ref([]) const followings = ref([])
const medals = ref([])
const subscribed = ref(false) const subscribed = ref(false)
const isLoading = ref(true) const isLoading = ref(true)
const tabLoading = ref(false) const tabLoading = ref(false)
@@ -401,6 +402,22 @@ export default {
tabLoading.value = false tabLoading.value = false
} }
const fetchAchievements = async () => {
const res = await fetch(`${API_BASE_URL}/api/medals?userId=${user.value.id}`)
if (res.ok) {
medals.value = await res.json()
} else {
medals.value = []
toast.error('获取成就失败')
}
}
const loadAchievements = async () => {
tabLoading.value = true
await fetchAchievements()
tabLoading.value = false
}
const subscribeUser = async () => { const subscribeUser = async () => {
const token = getToken() const token = getToken()
if (!token) { if (!token) {
@@ -455,11 +472,16 @@ export default {
onMounted(init) onMounted(init)
const achievementsLoaded = ref(false)
watch(selectedTab, async val => { watch(selectedTab, async val => {
if (val === 'timeline' && timelineItems.value.length === 0) { if (val === 'timeline' && timelineItems.value.length === 0) {
await loadTimeline() await loadTimeline()
} else if (val === 'following' && followers.value.length === 0 && followings.value.length === 0) { } else if (val === 'following' && followers.value.length === 0 && followings.value.length === 0) {
await loadFollow() await loadFollow()
} else if (val === 'achievements' && !achievementsLoaded.value) {
await loadAchievements()
achievementsLoaded.value = true
} }
}) })
return { return {
@@ -469,6 +491,7 @@ export default {
timelineItems, timelineItems,
followers, followers,
followings, followings,
medals,
subscribed, subscribed,
isMine, isMine,
isLoading, isLoading,
@@ -480,6 +503,7 @@ export default {
stripMarkdownLength, stripMarkdownLength,
loadTimeline, loadTimeline,
loadFollow, loadFollow,
loadAchievements,
loadSummary, loadSummary,
subscribeUser, subscribeUser,
unsubscribeUser, unsubscribeUser,