mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-03-06 20:10:46 +08:00
feat: optimize achievements tab loading
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user